#include "CreateMMUTiledCanvas.hpp"

#include "I18N.hpp"
#include "libslic3r/AppConfig.hpp"
#include "libslic3r/Config.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/Utils.hpp"
#include "libslic3r/Format/STL.hpp"
#include "libslic3r/TriangleMesh.hpp"
#include "format.hpp"
#include "GUI.hpp"
#include "GUI_Utils.hpp"
#include "GUI_ObjectList.hpp"
#include "Plater.hpp"
#include "slic3r/Utils/Http.hpp"
#include "Tab.hpp"
#include "../Utils/Http.hpp"
#include <wx/notebook.h>
#include "Notebook.hpp"

#include "MainFrame.hpp"
#include "wxExtensions.hpp"

#include <iostream>
#include <ctime>
#include <stdio.h>
#include <stdlib.h>

#include <wx/wx.h>
#include <wx/brush.h>
#include <wx/scrolwin.h>
#include <wx/display.h>
#include <wx/file.h>
#include <wx/mimetype.h>
#include <wx/odcombo.h>
#include <wx/textctrl.h>
#include <wx/wrapsizer.h>
#include "wxExtensions.hpp"

#include <boost/filesystem/path.hpp>
#include <boost/nowide/fstream.hpp>

#if ENABLE_SCROLLABLE
static wxSize get_screen_size(wxWindow* window)
{
    const auto idx = wxDisplay::GetFromWindow(window);
    wxDisplay display(idx != wxNOT_FOUND ? idx : 0u);
    return display.GetClientArea().GetSize();
}
#endif // ENABLE_SCROLLABLE

namespace Slic3r {
namespace GUI {
    //available on https://rplace.space/combined/ the 2022/06/04 (15gio of png)
    std::vector<long> rplace_timestamp{ 
        //1
        1648822500, 1648822512, 1648822759, 1648822791, 1648822835, 1648822853, 1648822884, 1648822916, 1648822947, 1648822992, 1648823023, 1648823054, 1648823086, 1648823118, 1648823149, 1648823181, 1648823212, 1648823244, 1648823275, 1648823310, 1648823342, 1648823373, 1648823405, 1648823436, 1648823468, 1648823500, 1648823532, 1648823563, 1648823595, 1648823626, 1648823881, 1648823912, 1648823944, 1648823975, 1648824007, 1648824038, 1648824070, 1648824101, 1648824132, 1648824164, 1648824195, 1648824227, 1648824258, 1648824290, 1648824321, 1648824352, 1648824384, 1648824415, 1648824447, 1648824479, 1648824511, 1648824542, 1648824574, 1648824606, 1648824637, 1648824669, 1648824700, 1648824732, 1648824764, 1648824795, 1648824827, 1648824859, 1648824890, 1648824922, 1648824953, 1648824985, 1648825017, 1648825048, 1648825080, 1648825112, 1648825144, 1648825175, 1648825206, 1648825237, 1648825269, 1648825300, 1648825332, 1648825363, 1648825394, 1648825426, 1648825458, 1648825489, 1648825521, 1648825552, 1648825583, 1648825615, 1648825646, 1648825678, 1648825710, 1648825741, 1648825773, 1648825804, 1648825836, 1648825867, 1648825899, 1648825930, 1648825962, 1648825993, 1648826025, 1648826056, 1648826088, 1648826120, 1648826151, 1648826183, 1648826214, 1648826246, 1648826277, 1648826309, 1648826340, 1648826372, 1648826403, 1648826435, 1648826467, 1648826498, 1648826530, 1648826562, 1648826594, 1648826625, 1648826657, 1648826688, 1648826720, 1648826751, 1648826783, 1648826814, 1648826877, 1648826909, 1648826940, 1648826972, 1648827003, 1648827035, 1648827066, 1648827098, 1648827129, 1648827161, 1648827192, 1648827224, 1648827256, 1648827288, 1648827320, 1648827352, 1648827383, 1648827415, 1648827585, 1648827616, 1648827648, 1648827680, 1648827711, 1648827742, 1648827774, 1648827806, 1648827837, 1648827869, 1648827901, 1648827932, 1648827964, 1648827996, 1648828028, 1648828059, 1648828093, 1648828124, 1648828156, 1648828188, 1648828220, 1648828251, 1648828283, 1648828314, 1648828347, 1648828379, 1648828442, 1648828475, 1648828538, 1648828570, 1648828602, 1648828634, 1648828665, 1648828697, 1648828729, 1648828761, 1648828792, 1648828824, 1648828888, 1648828919, 1648828951, 1648828982, 1648829014, 1648829045, 1648829077, 1648829108, 1648829140, 1648829203, 1648829235, 1648829266, 1648829298, 1648829330, 1648829393, 1648829425, 1648829457, 1648829489, 1648829520, 1648829552, 1648829584, 1648829616, 1648829648, 1648829679, 1648829714, 1648829746, 1648829808, 1648829840, 1648829877, 1648829940, 1648830007, 1648830039, 1648830070, 1648830102, 1648830133, 1648830165, 1648830197, 1648830228, 1648830260, 1648830328, 1648830361, 1648830392, 1648830423, 1648830455, 1648830487, 1648830611, 1648830643, 1648830675, 1648830707, 1648830739, 1648830770, 1648830803, 1648830834, 1648830865, 1648830928, 1648830959, 1648830991, 1648831023, 1648831054, 1648831117, 1648831148, 1648831180, 1648831212, 1648831243, 1648831276, 1648831308, 1648831340, 1648831371, 1648831403, 1648831434, 1648831467, 1648831498, 1648831530, 1648831561, 1648831624, 1648831660, 1648831691, 1648831723, 1648831756, 1648831787, 1648831881, 1648831913, 1648831944, 1648831975, 1648832007, 1648832039, 1648832071, 1648832103, 1648832134, 1648832165, 1648832197, 1648832228, 1648832260, 1648832291, 1648832322, 1648832385, 1648832416, 1648832447, 1648832479, 1648832510, 1648832542, 1648832573, 1648832605, 1648832636, 1648832668, 1648832700, 1648832731, 1648832762, 1648832794, 1648832826, 1648832858, 1648832890, 1648832922, 1648832953, 1648832984, 1648833016, 1648833047, 1648833079, 1648833110, 1648833142, 1648833174, 1648833205, 1648833237, 1648833269, 1648833394, 1648833426, 1648833458, 1648833490, 1648833522, 1648833553, 1648833584, 1648833616, 1648833679, 1648833711, 1648833742, 1648833773, 1648833804, 1648833836, 1648833867, 1648833899, 1648833930, 1648833962, 1648833993, 1648834025, 1648834056, 1648834088, 1648834119, 1648834150, 1648834182, 1648834214, 1648834245, 1648834277, 1648834308, 1648834340, 1648834403, 1648834435, 1648834467, 1648834499, 1648834530, 1648834593, 1648834625, 1648834656, 1648834688, 1648834719, 1648834751, 1648834782, 1648834814, 1648834849, 1648834881, 1648834913, 1648834944, 1648834976, 1648835007, 1648835039, 1648835070, 1648835101, 1648835133, 1648835164, 1648835196, 1648835227, 1648835258, 1648835290, 1648835321, 1648835353, 1648835385, 1648835417, 1648835448, 1648835480, 1648835512, 1648835544, 1648835576, 1648835608, 1648835640, 1648835672, 1648835703, 1648835765, 1648835797, 1648835828, 1648835860, 1648835892, 1648835924, 1648835955, 1648835987, 1648836019, 1648836050, 1648836082, 1648836113, 1648836145, 1648836207, 1648836239, 1648836270, 1648836301, 1648836333, 1648836364, 1648836396, 1648836427, 1648836460, 1648836522, 1648836585, 1648836617, 1648836648, 1648836679, 1648836712, 1648836743, 1648836775, 1648836806, 1648836838, 1648836869, 1648836900, 1648836963, 1648836995, 1648837026, 1648837058, 1648837089, 1648837121, 1648837152, 1648837183, 1648837215, 1648837247, 1648837278, 1648837309, 1648837341, 1648837372, 1648837404, 1648837435, 1648837467, 1648837499, 1648837531, 1648837562, 1648837594, 1648837625, 1648837656, 1648837689, 1648837720, 1648837752, 1648837784, 1648837815, 1648837847, 1648837878, 1648837910, 1648837941, 1648837973, 1648838004, 1648838036, 1648838067, 1648838099, 1648838130, 1648838161, 1648838193, 1648838225, 1648838256, 1648838288, 1648838320, 1648838351, 1648838382, 1648838414, 1648838445, 1648838477, 1648838508, 1648838540, 1648838571, 1648838603, 1648838634, 1648838665, 1648838697, 1648838729, 1648838761, 1648838792, 1648838825, 1648838856, 1648838887, 1648838919, 1648838951, 1648838982, 1648839013, 1648839045, 1648839076, 1648839107, 1648839139, 1648839170, 1648839201, 1648839233, 1648839264, 1648839296, 1648839327, 1648839359, 1648839391, 1648839423, 1648839454, 1648839485, 1648839517, 1648839548, 1648839579, 1648839611, 1648839642, 1648839673, 1648839704, 1648839736, 1648839767, 1648839799, 1648839830, 1648839862, 1648839893, 1648839924, 1648839956, 1648839987, 1648840018, 1648840050, 1648840081, 1648840113, 1648840144, 1648840175, 1648840206, 1648840238, 1648840269, 1648840300, 1648840331, 1648840363, 1648840394, 1648840426, 1648840457, 1648840489, 1648840521, 1648840769, 1648840800, 1648840833, 1648840864, 1648840896, 1648840928, 1648840960, 1648840991, 1648841023, 1648841055, 1648841087, 1648841119, 1648841150, 1648841182, 1648841214, 1648841246, 1648841277, 1648841309, 1648841340, 1648841372, 1648841403, 1648841435, 1648841466, 1648841498, 1648841529, 1648841561, 1648841592, 1648841623, 1648841655, 1648841686, 1648841717, 1648841748, 1648841780, 1648841811, 1648841843, 1648841874, 1648841906, 1648841937, 1648841968, 1648841999, 1648842031, 1648842063, 1648842094, 1648842126, 1648842157, 1648842188, 1648842219, 1648842250, 1648842282, 1648842314, 1648842345, 1648842376, 1648842408, 1648842439, 1648842470, 1648842501, 1648842533, 1648842565, 1648842596, 1648842628, 1648842659, 1648842691, 1648842722, 1648842754, 1648842785, 1648842817, 1648842848, 1648842880, 1648842911, 1648842942, 1648842974, 1648843005, 1648843037, 1648843068, 1648843100, 1648843131, 1648843162, 1648843194, 1648843226, 1648843257, 1648843289, 1648843320, 1648843352, 1648843383, 1648843414, 1648843446, 1648843478, 1648843509, 1648843541, 1648843572, 1648843604, 1648843635, 1648843667, 1648843698, 1648843730, 1648843761, 1648843792, 1648843824, 1648843855, 1648843887, 1648843919, 1648843950, 1648843981, 1648844012, 1648844043, 1648844076, 1648844107, 1648844139, 1648844171, 1648844202, 1648844234, 1648844265, 1648844296, 1648844328, 1648844390, 1648844421, 1648844453, 1648844484, 1648844515, 1648844546, 1648844577, 1648844608, 1648844640, 1648844671, 1648844702, 1648844733, 1648844765, 1648844796, 1648844829, 1648844860, 1648844892, 1648844923, 1648844955, 1648844986, 1648845017, 1648845049, 1648845080, 1648845112, 1648845144, 1648845175, 1648845206, 1648845238, 1648845269, 1648845302, 1648845333, 1648845365, 1648845396, 1648845428, 1648845459, 1648845491, 1648845523, 1648845555, 1648845587, 1648845618, 1648845650, 1648845681, 1648845712, 1648845744, 1648845775, 1648845807, 1648845838, 1648845870, 1648845901, 1648845933, 1648845965, 1648845996, 1648846028, 1648846059, 1648846090, 1648846122, 1648846153, 1648846185, 1648846216, 1648846248, 1648846279, 1648846310, 1648846342, 1648846373, 1648846404, 1648846436, 1648846467, 1648846498, 1648846530, 1648846562, 1648846593, 1648846625, 1648846657, 1648846689, 1648846720, 1648846752, 1648846784, 1648846816, 1648846848, 1648846879, 1648846910, 1648846942, 1648846973, 1648847004, 1648847036, 1648847067, 1648847099, 1648847130, 1648847161, 1648847193, 1648847224, 1648847256, 1648847287, 1648847319, 1648847350, 1648847382, 1648847414, 1648847445, 1648847476, 1648847508, 1648847539, 1648847571, 1648847603, 1648847635, 1648847666, 1648847698, 1648847729, 1648847760, 1648847792, 1648847823, 1648847854, 1648847886, 1648847917, 1648847948, 1648848011, 1648848042, 1648848073, 1648848105, 1648848136, 1648848168, 1648848199, 1648848231, 1648848262, 1648848293, 1648848325, 1648848356, 1648848387, 1648848418, 1648848450, 1648848482, 1648848513, 1648848545, 1648848577, 1648848608, 1648848640, 1648848671, 1648848702, 1648848734, 1648848765, 1648848796, 1648848828, 1648848859, 1648848891, 1648848922, 1648848954, 1648848985, 1648849017, 1648849049, 1648849080, 1648849111, 1648849143, 1648849175, 1648849206, 1648849238, 1648849269, 1648849300, 1648849332, 1648849363, 1648849395, 1648849426, 1648849459, 1648849491, 1648849521, 1648849553, 1648849585, 1648849617, 1648849648, 1648849680, 1648849711, 1648849743, 1648849774, 1648849805, 1648849836, 1648849868, 1648849899, 1648849931, 1648849962, 1648849994, 1648850025, 1648850056, 1648850088, 1648850120, 1648850151, 1648850182, 1648850214, 1648850246, 1648850278, 1648850309, 1648850341, 1648850373, 
        //2
        1648850405, 1648850437, 1648850468, 1648850500, 1648850531, 1648850563, 1648850594, 1648850625, 1648850657, 1648850689, 1648850720, 1648850752, 1648850784, 1648850816, 1648850847, 1648850879, 1648850911, 1648850942, 1648850974, 1648851005, 1648851037, 1648851068, 1648851100, 1648851131, 1648851163, 1648851195, 1648851227, 1648851258, 1648851291, 1648851322, 1648851354, 1648851385, 1648851417, 1648851449, 1648851481, 1648851512, 1648851544, 1648851575, 1648851731, 1648851764, 1648851795, 1648851826, 1648851857, 1648851889, 1648851920, 1648851951, 1648851983, 1648852014, 1648852046, 1648852077, 1648852109, 1648852141, 1648852173, 1648852204, 1648852235, 1648852267, 1648852298, 1648852329, 1648852361, 1648852392, 1648852424, 1648852455, 1648852487, 1648852518, 1648852550, 1648852581, 1648852612, 1648852644, 1648852675, 1648852707, 1648852739, 1648852771, 1648852802, 1648852834, 1648852866, 1648852898, 1648852929, 1648852960, 1648852992, 1648853024, 1648853055, 1648853087, 1648853118, 1648853150, 1648853181, 1648853212, 1648853244, 1648853275, 1648853306, 1648853338, 1648853369, 1648853401, 1648853432, 1648853464, 1648853496, 1648853527, 1648853559, 1648853590, 1648853622, 1648853654, 1648853685, 1648853716, 1648853748, 1648853779, 1648853810, 1648853842, 1648853873, 1648853905, 1648853936, 1648853968, 1648853999, 1648854031, 1648854062, 1648854094, 1648854125, 1648854156, 1648854187, 1648854219, 1648854250, 1648854282, 1648854313, 1648854344, 1648854376, 1648854407, 1648854439, 1648854471, 1648854502, 1648854533, 1648854565, 1648854597, 1648854628, 1648854660, 1648854691, 1648854722, 1648854754, 1648854785, 1648854817, 1648854848, 1648854880, 1648854912, 1648854943, 1648854975, 1648855006, 1648855038, 1648855069, 1648855100, 1648855132, 1648855163, 1648855195, 1648855227, 1648855258, 1648855289, 1648855352, 1648855384, 1648855416, 1648855448, 1648855479, 1648855511, 1648855543, 1648855575, 1648855606, 1648855638, 1648855669, 1648855700, 1648855732, 1648855763, 1648855795, 1648855826, 1648855857, 1648855889, 1648855920, 1648855952, 1648855985, 1648856016, 1648856047, 1648856079, 1648856110, 1648856142, 1648856174, 1648856205, 1648856236, 1648856267, 1648856299, 1648856330, 1648856361, 1648856393, 1648856424, 1648856455, 1648856487, 1648856518, 1648856550, 1648856581, 1648856612, 1648856643, 1648856675, 1648856707, 1648856738, 1648856770, 1648856801, 1648856833, 1648856864, 1648856896, 1648856927, 1648856959, 1648856990, 1648857022, 1648857053, 1648857084, 1648857116, 1648857147, 1648857178, 1648857210, 1648857241, 1648857273, 1648857304, 1648857335, 1648857367, 1648857398, 1648857430, 1648857461, 1648857492, 1648857524, 1648857556, 1648857587, 1648857618, 1648857649, 1648857681, 1648857712, 1648857743, 1648857775, 1648857806, 1648857838, 1648857869, 1648857900, 1648857932, 1648857963, 1648857995, 1648858026, 1648858057, 1648858089, 1648858121, 1648858153, 1648858184, 1648858215, 1648858247, 1648858277, 1648858309, 1648858340, 1648858371, 1648858402, 1648858434, 1648858465, 1648858497, 1648858528, 1648858559, 1648858591, 1648858624, 1648858655, 1648858687, 1648858719, 1648858750, 1648858782, 1648858813, 1648858845, 1648858876, 1648858908, 1648859001, 1648859032, 1648859064, 1648859095, 1648859126, 1648859157, 1648859190, 1648859221, 1648859252, 1648859283, 1648859315, 1648859346, 1648859377, 1648859408, 1648859440, 1648859471, 1648859502, 1648859534, 1648859566, 1648859597, 1648859628, 1648859660, 1648859691, 1648859722, 1648859754, 1648859785, 1648859817, 1648859849, 1648859880, 1648859912, 1648859943, 1648859974, 1648860005, 1648860036, 1648860068, 1648860100, 1648860131, 1648860162, 1648860194, 1648860225, 1648860257, 1648860288, 1648860320, 1648860351, 1648860382, 1648860413, 1648860445, 1648860476, 1648860507, 1648860538, 1648860569, 1648860601, 1648860632, 1648860664, 1648860695, 1648860728, 1648860759, 1648860791, 1648860822, 1648860853, 1648860885, 1648860917, 1648860948, 1648860980, 1648861011, 1648861043, 1648861074, 1648861106, 1648861137, 1648861169, 1648861200, 1648861232, 1648861263, 1648861295, 1648861326, 1648861358, 1648861389, 1648861421, 1648861453, 1648861484, 1648861516, 1648861547, 1648861578, 1648861610, 1648861641, 1648861673, 1648861704, 1648861736, 1648861767, 1648861799, 1648861830, 1648861861, 1648861893, 1648861924, 1648861955, 1648861987, 1648862018, 1648862050, 1648862081, 1648862113, 1648862144, 1648862176, 1648862208, 1648862239, 1648862270, 1648862302, 1648862334, 1648862365, 1648862397, 1648862428, 1648862460, 1648862492, 1648862523, 1648862556, 1648862742, 1648862773, 1648862804, 1648862836, 1648862867, 1648862899, 1648862930, 1648862961, 1648862993, 1648863025, 1648863056, 1648863089, 1648863121, 1648863152, 1648863183, 1648863215, 1648863246, 1648863277, 1648863308, 1648863340, 1648863371, 1648863403, 1648863434, 1648863466, 1648863497, 1648863528, 1648863560, 1648863591, 1648863622, 1648863654, 1648863685, 1648863717, 1648863748, 1648863780, 1648863811, 1648863843, 1648863874, 1648863906, 1648863938, 1648863969, 1648864001, 1648864032, 1648864063, 1648864095, 1648864127, 1648864158, 1648864189, 1648864221, 1648864253, 1648864285, 1648864316, 1648864348, 1648864379, 1648864411, 1648864442, 1648864473, 1648864505, 1648864536, 1648864567, 1648864599, 1648864630, 1648864662, 1648864693, 1648864725, 1648864756, 1648864787, 1648864819, 1648864850, 1648864883, 1648864914, 1648864945, 1648864977, 1648865008, 1648865040, 1648865072, 1648865104, 1648865136, 1648865167, 1648865198, 1648865230, 1648865261, 1648865293, 1648865324, 1648865356, 1648865387, 1648865419, 1648865450, 1648865482, 1648865514, 1648865545, 1648865576, 1648865608, 1648865639, 1648865671, 1648865702, 1648865734, 1648865765, 1648865796, 1648865827, 1648865859, 1648865890, 1648865922, 1648865953, 1648865985, 1648866016, 1648866048, 1648866079, 1648866112, 1648866143, 1648866174, 1648866206, 1648866237, 1648866269, 1648866300, 1648866363, 1648866394, 1648866426, 1648866457, 1648866488, 1648866520, 1648866552, 1648866584, 1648866616, 1648866647, 1648866679, 1648866710, 1648866741, 1648866773, 1648866804, 1648866836, 1648866868, 1648866900, 1648866931, 1648866963, 1648866994, 1648867026, 1648867057, 1648867089, 1648867120, 1648867152, 1648867183, 1648867215, 1648867246, 1648867278, 1648867309, 1648867341, 1648867373, 1648867404, 1648867435, 1648867467, 1648867498, 1648867530, 1648867561, 1648867593, 1648867624, 1648867655, 1648867687, 1648867718, 1648867750, 1648867783, 1648867814, 1648867845, 1648867876, 1648867908, 1648867939, 1648867970, 1648868003, 1648868035, 1648868066, 1648868098, 1648868129, 1648868161, 1648868192, 1648868224, 1648868256, 1648868287, 1648868318, 1648868350, 1648868381, 1648868412, 1648868444, 1648868475, 1648868507, 1648868538, 1648868569, 1648868601, 1648868633, 1648868664, 1648868696, 1648868727, 1648868758, 1648868790, 1648868821, 1648868853, 1648868884, 1648868916, 1648868947, 1648868979, 1648869010, 1648869041, 1648869073, 1648869105, 1648869136, 1648869167, 1648869199, 1648869230, 1648869262, 1648869293, 1648869324, 1648869356, 1648869387, 1648869419, 1648869450, 1648869481, 1648869513, 1648869544, 1648869576, 1648869607, 1648869639, 1648869670, 1648869702, 1648869733, 1648869764, 1648869796, 1648869827, 1648869859, 1648869890, 1648869922, 1648870263, 1648870294, 1648870326, 1648870357, 1648870389, 1648870420, 1648870452, 1648870483, 1648870515, 1648870546, 1648870578, 1648870609, 1648870641, 1648870672, 1648870704, 1648870735, 1648870766, 1648870797, 1648870829, 1648870860, 1648870892, 1648870923, 1648870955, 1648870986, 1648871018, 1648871050, 1648871081, 1648871113, 1648871144, 1648871175, 1648871206, 1648871238, 1648871270, 1648871301, 1648871333, 1648871364, 1648871396, 1648871427, 1648871459, 1648871490, 1648871522, 1648871553, 1648871585, 1648871616, 1648871647, 1648871679, 1648871710, 1648871741, 1648871773, 1648871805, 1648871836, 1648871867, 1648871899, 1648871930, 1648871962, 1648871993, 1648872025, 1648872056, 1648872087, 1648872119, 1648872151, 1648872182, 1648872214, 1648872245, 1648872277, 1648872308, 1648872340, 1648872371, 1648872402, 1648872434, 1648872465, 1648872497, 1648872528, 1648872560, 1648872591, 1648872623, 1648872654, 1648872686, 1648872718, 1648872749, 1648872781, 1648872812, 1648872843, 1648872875, 1648872906, 1648872937, 1648872969, 1648873000, 1648873032, 1648873064, 1648873096, 1648873127, 1648873159, 1648873190, 1648873222, 1648873254, 1648873286, 1648873317, 1648873349, 1648873380, 1648873411, 1648873443, 1648873474, 1648873506, 1648873537, 1648873568, 1648873600, 1648873631, 1648873663, 1648873695, 1648873726, 1648873758, 1648873790, 1648873822, 1648873915, 1648873947, 1648873978, 1648874010, 1648874041, 1648874073, 1648874104, 1648874136, 1648874168, 1648874199, 1648874231, 1648874262, 1648874293, 1648874325, 1648874357, 1648874389, 1648874420, 1648874452, 1648874484, 1648874516, 1648874547, 1648874578, 1648874611, 1648874643, 1648874674, 1648874705, 1648874737, 1648874768, 1648874800, 1648874831, 1648874863, 1648874894, 1648874925, 1648874957, 1648874989, 1648875020, 1648875052, 1648875083, 1648875115, 1648875147, 1648875179, 1648875210, 1648875243, 1648875274, 1648875305, 1648875336, 1648875368, 1648875400, 1648875431, 1648875463, 1648875494, 1648875526, 1648875557, 1648875589, 1648875620, 1648875652, 1648875683, 1648875715, 1648875747, 1648875778, 1648875809, 1648875841, 1648875872, 1648875904, 1648875935, 1648875966, 1648875998, 1648876029, 1648876061, 1648876092, 1648876124, 1648876155, 1648876186, 1648876219, 1648876250, 1648876281, 1648876313, 1648876345, 1648876376, 1648876408, 1648876439, 1648876470, 1648876502, 1648876534, 1648876565, 1648876597, 1648876628, 1648876660, 1648876691, 1648876723, 1648876754, 1648876785, 1648876817, 1648876848, 1648876880, 1648876911, 1648876943, 1648876974, 1648877006, 1648877037, 1648877069, 1648877101, 1648877132, 1648877163, 1648877195, 1648877227, 1648877258, 1648877289, 1648877321, 1648877352, 1648877384, 1648877415, 1648877447, 1648877478, 1648877541, 1648877573, 1648877604, 1648877636, 1648877667, 1648877698, 1648877729, 1648877761, 1648877792, 1648877824, 1648877856, 1648877887, 1648877919, 1648877951, 1648877983, 1648878014, 1648878046, 1648878078, 1648878110, 1648878141, 1648878173, 1648878205, 1648878236, 1648878267, 1648878299, 1648878330, 1648878361, 1648878393, 1648878424, 1648878456, 1648878487, 1648878519, 1648878551, 1648878582, 1648878614, 1648878645, 1648878676, 1648878708, 1648878740, 1648878771, 1648878803, 1648878834, 1648878866, 1648878897, 1648878929, 1648878960, 1648878992, 1648879023, 1648879054, 1648879086, 1648879117, 1648879149, 1648879180, 1648879212, 1648879244, 1648879275, 1648879307, 1648879339, 1648879371, 1648879402, 1648879433, 1648879464, 1648879496, 1648879528, 1648879560, 1648879591, 1648879623, 1648879654, 1648879686, 1648879718, 1648879750, 1648879781, 1648879812, 1648879844, 1648879876, 1648879908, 1648879939, 1648879970, 1648880002, 1648880033, 1648880065, 1648880097, 1648880128, 1648880160, 1648880191, 1648880222, 1648880254, 1648880285, 1648880317, 1648880348, 1648880379, 1648880410, 1648880442, 1648880473, 1648880505, 1648880536, 1648880568, 1648880599, 1648880630, 1648880662, 1648880693, 1648880725, 1648880756, 1648880788, 1648880820, 1648880851, 1648880883, 1648880914, 1648880946, 1648880977, 1648881009, 1648881040, 1648881072, 1648881103, 1648881290, 1648881321, 1648881353, 1648881384, 1648881416, 1648881447, 1648881479, 1648881510, 1648881542, 1648881573, 1648881605, 1648881636, 1648881668, 1648881700, 1648881731, 1648881763, 1648881794, 1648881825, 1648881858, 1648881889, 1648881921, 1648881953, 1648881984, 1648882015, 1648882047, 1648882078, 1648882110, 1648882141, 1648882173, 1648882204, 1648882236, 1648882268, 1648882299, 1648882331, 1648882362, 1648882393, 1648882425, 1648882457, 1648882488, 1648882519, 1648882550, 1648882582, 1648882614, 1648882645, 1648882677, 1648882709, 1648882740, 1648882771, 1648882802, 1648882834, 1648882865, 1648882896, 1648882928, 1648882959, 1648882991, 1648883022, 1648883053, 1648883085, 1648883117, 1648883148, 1648883180, 1648883212, 1648883243, 1648883274, 1648883306, 1648883338, 1648883369, 1648883401, 1648883432, 1648883464, 1648883496, 1648883527, 1648883559, 1648883590, 1648883621, 1648883653, 1648883685, 1648883716, 1648883748, 1648883779, 1648883810, 1648883842, 1648883873, 1648883904, 1648883936, 1648883967, 1648883999, 1648884030, 1648884062, 1648884093, 1648884125, 1648884156, 1648884188, 1648884219, 1648884250, 1648884282, 1648884313, 1648884344, 1648884376, 1648884407, 1648884439, 1648884471, 1648884502, 1648884533, 1648884565, 1648884598, 1648884629, 1648884661, 1648884692, 1648884724, 1648884755, 1648884787, 1648884818, 1648884850, 1648884913, 1648884944, 1648884976, 1648885007, 1648885038, 1648885070, 1648885101, 1648885134, 1648885165, 1648885197, 1648885228, 1648885260, 1648885292, 1648885323, 1648885354, 1648885387, 1648885418, 1648885449, 1648885481, 1648885512, 1648885543, 1648885575, 1648885606, 1648885638, 1648885669, 1648885701, 1648885732, 1648885764, 1648885795, 1648885826, 1648885858, 1648885889, 1648885921, 1648885952, 1648885984, 1648886016, 1648886047, 1648886079, 1648886111, 1648886142, 1648886174, 1648886205, 1648886237, 1648886268, 1648886299, 1648886331, 1648886363, 1648886394, 1648886426, 1648886457, 1648886489, 1648886520, 1648886551, 1648886583, 1648886615, 1648886646, 1648886678, 1648886710, 1648886741, 1648886772, 1648886804, 1648886836, 1648886867, 1648886899, 1648886930, 1648886961, 1648886993, 1648887024, 1648887055, 1648887087, 1648887118, 1648887150, 1648887181, 1648887213, 1648887244, 1648887276, 1648887307, 1648887338, 1648887370, 1648887401, 1648887433, 1648887465, 1648887496, 1648887527, 1648887559, 1648887591, 1648887622, 1648887654, 1648887685, 1648887716, 1648887748, 1648887780, 1648887812, 1648887843, 1648887874, 1648887906, 1648887937, 1648887969, 1648888001, 1648888032, 1648888063, 1648888096, 1648888127, 1648888158, 1648888190, 1648888221, 1648888253, 1648888284, 1648888315, 1648888347, 1648888378, 1648888410, 1648888442, 1648888474, 1648888723, 1648888755, 1648888786, 1648888818, 1648888850, 1648888881, 1648888912, 1648888943, 1648888975, 1648889006, 1648889038, 1648889069, 1648889100, 1648889132, 1648889163, 1648889195, 1648889226, 1648889258, 1648889289, 1648889321, 1648889352, 1648889384, 1648889415, 1648889447, 1648889478, 1648889509, 1648889541, 1648889573, 1648889604, 1648889636, 1648889667, 1648889699, 1648889730, 1648889762, 1648889793, 1648889825, 1648889856, 1648889888, 1648889919, 1648889950, 1648889982, 1648890013, 1648890044, 1648890076, 1648890108, 1648890139, 1648890171, 1648890203, 1648890234, 1648890266, 1648890297, 1648890329, 1648890360, 1648890392, 1648890423, 1648890455, 1648890486, 1648890518, 1648890549, 1648890580, 1648890612, 1648890643, 1648890674, 1648890706, 1648890737, 1648890768, 1648890801, 1648890832, 1648890863, 1648890895, 1648890926, 1648890957, 1648890989, 1648891020, 1648891052, 1648891083, 1648891115, 1648891147, 1648891178, 1648891210, 1648891241, 1648891273, 1648891304, 1648891336, 1648891367, 1648891398, 1648891430, 1648891461, 1648891492, 1648891523, 1648891555, 1648891587, 1648891619, 1648891650, 1648891682, 1648891713, 1648891745, 1648891777, 1648891808, 1648891840, 1648891871, 1648891902, 1648891934, 1648891966, 1648891998, 1648892029, 1648892061, 1648892092, 1648892124, 1648892155, 1648892186, 1648892218, 1648892249, 1648892280, 1648892343, 1648892375, 1648892407, 1648892438, 1648892469, 1648892501, 1648892532, 1648892564, 1648892595, 1648892626, 1648892658, 1648892690, 1648892721, 1648892753, 1648892784, 1648892816, 1648892847, 1648892879, 1648892910, 1648892942, 1648892973, 1648893005, 1648893036, 1648893068, 1648893099, 1648893131, 1648893162, 1648893194, 1648893225, 1648893257, 1648893288, 1648893320, 1648893351, 1648893383, 1648893415, 1648893446, 1648893478, 1648893509, 1648893540, 1648893572, 1648893604, 1648893635, 1648893666, 1648893698, 1648893729, 1648893760, 1648893792, 1648893823, 1648893855, 1648893886, 1648893918, 1648893949, 1648893981, 1648894013, 1648894044, 1648894076, 1648894108, 1648894139, 1648894170, 1648894202, 1648894233, 1648894265, 1648894297, 1648894329, 1648894360, 1648894392, 1648894423, 1648894456, 1648894488, 1648894519, 1648894551, 1648894582, 1648894614, 1648894646, 1648894677, 1648894708, 1648894740, 1648894772, 1648894803, 1648894835, 1648894866, 1648894898, 1648894929, 1648894961, 1648894992, 1648895023, 1648895055, 1648895086, 1648895118, 1648895149, 1648895181, 1648895212, 1648895244, 1648895275, 1648895307, 1648895338, 1648895369, 1648895401, 1648895432, 1648895464, 1648895496, 1648895527, 1648895558, 1648895590, 1648895621, 1648895652, 1648895684, 1648895715, 1648895747, 1648895779, 1648895810, 1648895841, 1648895874, 1648895905, 1648896092, 1648896124, 1648896156, 1648896187, 1648896218, 1648896250, 1648896281, 1648896312, 1648896344, 1648896376, 1648896407, 1648896439, 1648896470, 1648896501, 1648896532, 1648896564, 1648896597, 1648896629, 1648896660, 1648896692, 1648896723, 1648896754, 1648896786, 1648896817, 1648896849, 1648896880, 1648896912, 1648896943, 1648896974, 1648897006, 1648897038, 1648897069, 1648897101, 1648897132, 1648897164, 1648897195, 1648897227, 1648897258, 1648897289, 1648897321, 1648897353, 1648897384, 1648897416, 1648897447, 1648897479, 1648897511, 1648897542, 1648897573, 1648897604, 1648897636, 1648897667, 1648897698, 1648897730, 1648897761, 1648897793, 1648897824, 1648897856, 1648897888, 1648897919, 1648897950, 1648897982, 1648898014, 1648898045, 1648898077, 1648898108, 1648898139, 1648898171, 1648898202, 1648898234, 1648898265, 1648898297, 1648898328, 1648898360, 1648898391, 1648898422, 1648898454, 1648898485, 1648898516, 1648898548, 1648898580, 1648898611, 1648898643, 1648898674, 1648898706, 1648898737, 1648898769, 1648898801, 1648898833, 1648898864, 1648898896, 1648898927, 1648898958, 1648898990, 1648899021, 1648899052, 1648899084, 1648899115, 1648899147, 1648899179, 1648899210, 1648899241, 1648899273, 1648899304, 1648899336, 1648899367, 1648899399, 1648899430, 1648899462, 1648899494, 1648899525, 1648899557, 1648899588, 1648899620, 1648899652, 1648899947, 1648899979, 1648900011, 1648900043, 1648900074, 1648900106, 1648900137, 1648900169, 1648900201, 1648900233, 1648900264, 1648900296, 1648900327, 1648900358, 1648900389, 1648900421, 1648900452, 1648900483, 1648900515, 1648900547, 1648900578, 1648900610, 1648900641, 1648900673, 1648900704, 1648900735, 1648900767, 1648900798, 1648900830, 1648900861, 1648900892, 1648900924, 1648900956, 1648900987, 1648901018, 1648901112, 1648901143, 1648901175, 1648901206, 1648901238, 1648901269, 1648901302, 1648901333, 1648901365, 1648901396, 1648901427, 1648901459, 1648901490, 1648901521, 1648901553, 1648901584, 1648901615, 1648901646, 1648901678, 1648901710, 1648901741, 1648901773, 1648901804, 1648901836, 1648901867, 1648901899, 1648901930, 1648901961, 1648901993, 1648902025, 1648902057, 1648902089, 1648902120, 1648902151, 1648902184, 1648902215, 1648902246, 1648902278, 1648902310, 1648902342, 1648902375, 1648902406, 1648902437, 1648902470, 1648902502, 1648902533, 1648902565, 1648902596, 1648902628, 1648902659, 1648902691, 1648902722, 1648902754, 1648902786, 1648902817, 1648902848, 1648902879, 1648902911, 1648902943, 1648902975, 1648903006, 1648903037, 1648903068, 1648903100, 1648903132, 1648903163, 1648903195, 1648903226, 1648903257, 1648903289, 1648903321, 1648903353, 1648903384, 1648903416, 1648903447, 1648903479, 1648903510, 1648903541, 1648903573, 1648903604, 1648903636, 1648903667, 1648903699, 1648903731, 1648903763, 1648903794, 1648903825, 1648903857, 1648903888, 1648903919, 1648903951, 1648903982, 1648904014, 1648904045, 1648904076, 1648904108, 1648904139, 1648904170, 1648904202, 1648904233, 1648904264, 1648904296, 1648904327, 1648904358, 1648904390, 1648904421, 1648904452, 1648904484, 1648904515, 1648904546, 1648904578, 1648904609, 1648904641, 1648904672, 1648904734, 1648904766, 1648904797, 1648904829, 1648904860, 1648904892, 1648904923, 1648904954, 1648904986, 1648905018, 1648905049, 1648905081, 1648905113, 1648905145, 1648905176, 1648905208, 1648905239, 1648905272, 1648905303, 1648905334, 1648905366, 1648905397, 1648905429, 1648905460, 1648905492, 1648905523, 1648905555, 1648905586, 1648905618, 1648905649, 1648905681, 1648905713, 1648905744, 1648905775, 1648905807, 1648905838, 1648905870, 1648905902, 1648905933, 1648905965, 1648905996, 1648906028, 1648906059, 1648906091, 1648906123, 1648906154, 1648906185, 1648906216, 1648906248, 1648906279, 1648906311, 1648906343, 1648906374, 1648906405, 1648906437, 1648906469, 1648906500, 1648906532, 1648906563, 1648906595, 1648906626, 1648906657, 1648906689, 1648906721, 1648906752, 1648906784, 1648906815, 1648906846, 1648906877, 1648906909, 1648906940, 1648906971, 1648907003, 1648907034, 1648907066, 1648907098, 1648907130, 1648907163, 1648907194, 1648907226, 1648907258, 1648907289, 1648907320, 1648907352, 1648907384, 1648907415, 1648907446, 1648907477, 1648907509, 1648907540, 1648907572, 1648907603, 1648907635, 1648907667, 1648907698, 1648907729, 1648907760, 1648907791, 1648907823, 1648907855, 1648907886, 1648907917, 1648907949, 1648907980, 1648908011, 1648908043, 1648908074, 1648908105, 1648908137, 1648908169, 1648908200, 1648908231, 1648908263, 1648908295, 1648908482, 1648908514, 1648908545, 1648908577, 1648908608, 1648908639, 1648908671, 1648908703, 1648908734, 1648908765, 1648908797, 1648908828, 1648908859, 1648908891, 1648908922, 1648908953, 1648908985, 1648909016, 1648909048, 1648909080, 1648909111, 1648909142, 1648909174, 1648909206, 1648909237, 1648909269, 1648909301, 1648909332, 1648909364, 1648909396, 1648909427, 1648909459, 1648909490, 1648909522, 1648909553, 1648909585, 1648909616, 1648909648, 1648909680, 1648909711, 1648909742, 1648909774, 1648909806, 1648909838, 1648909869, 1648909900, 1648909931, 1648909963, 1648909994, 1648910026, 1648910058, 1648910089, 1648910121, 1648910152, 1648910184, 1648910216, 1648910247, 1648910278, 1648910310, 1648910341, 1648910372, 1648910404, 1648910435, 1648910467, 1648910498, 1648910529, 1648910560, 1648910592, 1648910624, 1648910655, 1648910687, 1648910718, 1648910749, 1648910781, 1648910812, 1648910843, 1648910874, 1648910905, 1648910937, 1648910968, 1648911000, 1648911031, 1648911063, 1648911094, 1648911126, 1648911158, 1648911189, 1648911221, 1648911252, 1648911285, 1648911316, 1648911347, 1648911379, 1648911411, 1648911442, 1648911474, 1648911505, 1648911537, 1648911568, 1648911601, 1648911632, 1648911664, 1648911695, 1648911726, 1648911758, 1648911790, 1648911822, 1648911853, 1648911885, 1648911917, 1648911948, 1648911979, 1648912011, 1648912042, 1648912253, 1648912284, 1648912316, 1648912347, 1648912378, 1648912409, 1648912441, 1648912472, 1648912504, 1648912536, 1648912567, 1648912598, 1648912630, 1648912661, 1648912693, 1648912727, 1648912759, 1648912790, 1648912821, 1648912853, 1648912884, 1648912916, 1648912947, 1648912979, 1648913010, 1648913041, 1648913073, 1648913104, 1648913136, 1648913167, 1648913199, 1648913231, 1648913262, 1648913294, 1648913325, 1648913357, 1648913389, 1648913420, 1648913452, 1648913483, 1648913515, 1648913546, 1648913577, 1648913609, 1648913641, 1648913672, 1648913703, 1648913734, 1648913766, 1648913798, 1648913829, 1648913862, 1648913893, 1648913924, 1648913956, 1648913988, 1648914019, 1648914050, 1648914082, 1648914114, 1648914145, 1648914177, 1648914208, 1648914240, 1648914271, 1648914303, 1648914335, 1648914366, 1648914398, 1648914429, 1648914460, 1648914492, 1648914523, 1648914554, 1648914586, 1648914618, 1648914649, 1648914681, 1648914712, 1648914745, 1648914776, 1648914808, 1648914840, 1648914872, 1648914904, 1648914936, 1648914967, 1648914999, 1648915030, 1648915062, 1648915093, 1648915124, 1648915156, 1648915187, 1648915218, 1648915250, 1648915281, 1648915312, 1648915344, 1648915375, 1648915406, 1648915438, 1648915469, 1648915500, 1648915532, 1648915563, 1648915594, 1648915625, 1648915656, 1648915688, 1648915719, 1648915750, 1648915782, 1648916122, 1648916153, 1648916184, 1648916216, 1648916247, 1648916279, 1648916310, 1648916342, 1648916373, 1648916405, 1648916436, 1648916468, 1648916498, 1648916530, 1648916561, 1648916592, 1648916624, 1648916655, 1648916686, 1648916717, 1648916749, 1648916780, 1648916811, 1648916843, 1648916873, 1648916905, 1648916937, 1648916968, 1648917000, 1648917031, 1648917062, 1648917093, 1648917124, 1648917156, 1648917187, 1648917218, 1648917250, 1648917281, 1648917312, 1648917343, 1648917374, 1648917406, 1648917437, 1648917469, 1648917500, 1648917531, 1648917562, 1648917593, 1648917625, 1648917656, 1648917687, 1648917719, 1648917750, 1648917781, 1648917812, 1648917843, 1648917874, 1648917906, 1648917938, 1648917969, 1648918001, 1648918032, 1648918063, 1648918095, 1648918126, 1648918157, 1648918188, 1648918220, 1648918251, 1648918283, 1648918314, 1648918345, 1648918376, 1648918408, 1648918439, 1648918471, 1648918502, 1648918533, 1648918565, 1648918596, 1648918628, 1648918659, 1648918690, 1648918721, 1648918752, 1648918784, 1648918815, 1648918846, 1648918878, 1648918909, 1648918940, 1648918971, 1648919004, 1648919035, 1648919066, 1648919097, 1648919128, 1648919159, 1648919190, 1648919221, 1648919253, 1648919285, 1648919316, 1648919347, 1648919378, 1648919410, 1648919441, 1648919472, 1648919503, 1648919534, 1648919565, 1648919596, 1648919629, 1648919660, 1648919723, 1648919755, 1648919786, 1648919817, 1648919848, 1648919880, 1648919911, 1648919943, 1648919974, 1648920006, 1648920037, 1648920068, 1648920099, 1648920130, 1648920161, 1648920192, 1648920223, 1648920254, 1648920285, 1648920316, 1648920348, 1648920379, 1648920410, 1648920442, 1648920473, 1648920504, 1648920535, 1648920567, 1648920598, 1648920629, 1648920661, 1648920692, 1648920724, 1648920755, 1648920786, 1648920818, 1648920849, 1648920881, 1648920912, 1648920943, 1648920975, 1648921005, 1648921037, 1648921068, 1648921099, 1648921130, 1648921161, 1648921192, 1648921224, 1648921255, 1648921286, 1648921318, 1648921349, 1648921380, 1648921411, 1648921442, 1648921474, 1648921505, 1648921536, 1648921567, 1648921599, 1648921632, 1648921663, 1648921694, 1648921725, 1648921757, 1648921788, 1648921819, 1648921850, 1648921883, 1648921914, 1648921937, 1648921968, 1648922000, 1648922032, 1648922064, 1648922096, 1648922128, 1648922160, 1648922192, 1648922224, 1648922255, 1648922287, 1648922319, 1648922351, 1648922383, 1648922415, 1648922446, 1648922478, 1648922510, 1648922542, 1648922573, 1648922605, 1648922637, 1648922669, 1648922701, 1648922733, 1648922764, 1648922796, 1648922828, 1648922860, 1648922892, 1648922924, 1648922955, 1648922987, 1648923019, 1648923052, 1648923084, 1648923116, 1648923148, 1648923180, 1648923212, 1648923245, 1648923277, 1648923309, 1648923341, 1648923373, 1648923404, 1648923436, 1648923468, 1648923500, 1648923532, 1648923564, 1648923597, 1648923628, 1648923661, 1648923693, 1648923725, 1648923757, 1648923789, 1648923821, 1648923853, 1648923884, 1648923916, 1648923948, 1648923980, 1648924012, 1648924044, 1648924076, 1648924109, 1648924146, 1648924180, 1648924214, 1648924248, 1648924283, 1648924317, 1648924352, 1648924385, 1648924419, 1648924458, 1648924491, 1648924525, 1648924559, 1648924595, 1648924629, 1648924664, 1648924699, 1648924735, 1648924770, 1648924803, 1648924835, 1648924870, 1648924904, 1648924937, 1648924972, 1648925008, 1648925043, 1648925076, 1648925113, 1648925146, 1648925184, 1648925217, 1648925252, 1648925490, 1648925522, 1648925557, 1648925590, 1648925623, 1648925655, 1648925687, 1648925718, 1648925750, 1648925782, 1648925814, 1648925846, 1648925878, 1648925910, 1648925943, 1648925974, 1648926007, 1648926038, 1648926070, 1648926102, 1648926134, 1648926166, 1648926197, 1648926230, 1648926262, 1648926293, 1648926326, 1648926358, 1648926390, 1648926422, 1648926454, 1648926487, 1648926519, 1648926550, 1648926583, 1648926614, 1648926647, 1648926678, 1648926710, 1648926743, 1648926775, 1648926807, 1648926839, 1648926871, 1648926903, 1648926935, 1648926967, 1648927000, 1648927032, 1648927063, 1648927095, 1648927127, 1648927159, 1648927190, 1648927222, 1648927254, 1648927286, 1648927318, 1648927350, 1648927383, 1648927415, 1648927448, 1648927481, 1648927513, 1648927545, 1648927576, 1648927608, 1648927640, 1648927672, 1648927704, 1648927737, 1648927769, 1648927801, 1648927832, 1648927864, 1648927897, 1648927929, 1648927961, 1648927993, 1648928024, 1648928056, 1648928088, 1648928120, 1648928152, 1648928184, 1648928216, 1648928247, 1648928279, 1648928311, 1648928343, 1648928376, 1648928408, 1648928440, 1648928472, 1648928505, 1648928537, 1648928569, 1648928602, 1648928633, 1648928665, 1648928697, 1648928729, 1648928761, 1648928793, 1648928825, 1648928857, 1648928888, 1648928920, 1648928952, 1648928985, 1648929017, 1648929141, 1648929173, 1648929205, 1648929244, 1648929276, 1648929307, 1648929338, 1648929370, 1648929401, 1648929432, 1648929464, 1648929495, 1648929526, 1648929557, 1648929589, 1648929620, 1648929651, 1648929682, 1648929714, 1648929745, 1648929776, 1648929809, 1648929840, 1648929871, 1648929902, 1648929933, 1648929965, 1648929997, 1648930028, 1648930059, 1648930090, 1648930122, 1648930153, 1648930184, 1648930215, 1648930247, 1648930278, 1648930309, 1648930340, 1648930372, 1648930403, 1648930434, 1648930465, 1648930496, 1648930528, 1648930559, 1648930590, 1648930621, 1648930652, 1648930684, 1648930715, 1648930746, 1648930777, 1648930809, 1648930840, 1648930871, 1648930903, 1648930934, 1648930965, 1648930996, 1648931028, 1648931059, 1648931090, 1648931122, 1648931153, 1648931184, 1648931215, 1648931247, 1648931278, 1648931309, 1648931340, 1648931371, 1648931403, 1648931434, 1648931465, 1648931496, 1648931528, 1648931559, 1648931590, 1648931622, 1648931653, 1648931684, 1648931715, 1648931747, 1648931779, 1648931810, 1648931841, 1648931873, 1648931905, 1648931936, 1648931968, 1648931999, 1648933236, 1648933268, 1648933299, 1648933340, 1648933374, 1648933406, 1648933437, 1648933487, 1648933519, 1648933550, 1648933581, 1648933633, 1648933667, 1648933698, 1648933729, 1648933760, 1648933800, 1648933835, 1648933867, 1648933902, 1648933933, 1648933966, 1648933997, 1648934028, 1648934060, 1648934092, 1648934123, 1648934155, 1648934186, 1648934217, 1648934250, 1648934282, 1648934313, 1648934344, 1648934375, 1648934408, 1648934439, 1648934470, 1648934501, 1648934533, 1648934564, 1648934595, 1648934626, 1648934658, 1648934689, 1648934720, 1648934752, 1648934783, 1648934814, 1648934845, 1648934877, 1648934908, 1648934939, 1648934970, 1648935001, 1648935033, 1648935064, 1648935096, 1648935127, 1648935158, 1648935189, 1648935221, 1648935252, 1648935283, 1648935314, 1648935345, 1648935377, 1648935408, 1648935471, 1648935502, 1648935533, 1648935564, 1648935596, 1648935627, 1648935659, 1648935690, 1648935721, 1648935752, 1648935784, 1648935815, 1648935847, 1648935878, 1648935909, 1648935941, 1648935972, 1648936004, 1648936035, 1648936066, 1648936097, 1648936129, 1648936160, 1648936191, 1648936222, 1648936253, 1648936285, 1648936317, 1648936348, 1648936379, 1648936410, 1648936441, 1648936473, 1648936504, 1648936536, 1648936567, 1648936598, 1648936630, 1648936664, 1648936696, 1648936727, 1648936759, 1648936790, 
        //3
        1648936821, 1648936853, 1648936884, 1648936915, 1648936946, 1648936977, 1648937009, 1648937040, 1648937071, 1648937103, 1648937134, 1648937165, 1648937196, 1648937228, 1648937259, 1648937290, 1648937322, 1648937353, 1648937384, 1648937416, 1648937447, 1648937478, 1648937509, 1648937541, 1648937572, 1648937603, 1648937634, 1648937666, 1648937697, 1648937728, 1648937760, 1648937791, 1648937822, 1648937853, 1648937885, 1648937916, 1648937947, 1648937979, 1648938011, 1648938042, 1648938073, 1648938105, 1648938136, 1648938167, 1648938198, 1648938229, 1648938261, 1648938292, 1648938323, 1648938355, 1648938386, 1648938417, 1648938448, 1648938479, 1648938511, 1648938542, 1648938573, 1648938604, 1648938636, 1648938668, 1648938699, 1648938730, 1648938762, 1648938794, 1648938825, 1648938856, 1648938887, 1648938918, 1648938950, 1648938981, 1648939012, 1648939231, 1648939262, 1648939294, 1648939325, 1648939356, 1648939387, 1648939418, 1648939449, 1648939481, 1648939512, 1648939543, 1648939574, 1648939605, 1648939636, 1648939668, 1648939699, 1648939731, 1648939762, 1648939793, 1648939825, 1648939856, 1648939887, 1648939918, 1648939950, 1648939981, 1648940012, 1648940044, 1648940075, 1648940106, 1648940138, 1648940169, 1648940200, 1648940232, 1648940263, 1648940295, 1648940327, 1648940358, 1648940389, 1648940421, 1648940452, 1648940483, 1648940515, 1648940546, 1648940577, 1648940609, 1648940640, 1648940671, 1648940702, 1648940733, 1648940765, 1648940796, 1648940828, 1648940859, 1648940891, 1648940922, 1648940954, 1648940985, 1648941016, 1648941047, 1648941078, 1648941109, 1648941141, 1648941172, 1648941203, 1648941234, 1648941268, 1648941300, 1648941331, 1648941362, 1648941393, 1648941425, 1648941456, 1648941488, 1648941519, 1648941550, 1648941581, 1648941613, 1648941644, 1648941675, 1648941706, 1648941737, 1648941769, 1648941800, 1648941831, 1648941862, 1648941894, 1648941925, 1648941956, 1648941987, 1648942019, 1648942050, 1648942081, 1648942113, 1648942144, 1648942176, 1648942207, 1648942238, 1648942269, 1648942300, 1648942331, 1648942363, 1648942394, 1648942425, 1648942456, 1648942488, 1648942519, 1648942550, 1648942582, 1648942613, 1648942644, 1648942675, 1648942707, 1648942738, 1648942769, 1648942832, 1648942863, 1648942894, 1648942926, 1648942957, 1648942988, 1648943019, 1648943050, 1648943083, 1648943114, 1648943145, 1648943176, 1648943207, 1648943239, 1648943270, 1648943301, 1648943332, 1648943364, 1648943395, 1648943426, 1648943457, 1648943488, 1648943520, 1648943551, 1648943582, 1648943613, 1648943645, 1648943676, 1648943707, 1648943738, 1648943769, 1648943801, 1648943832, 1648943863, 1648943894, 1648943926, 1648943957, 1648943988, 1648944019, 1648944051, 1648944082, 1648944113, 1648944144, 1648944175, 1648944206, 1648944238, 1648944269, 1648944301, 1648944332, 1648944363, 1648944395, 1648944426, 1648944458, 1648944489, 1648944521, 1648944552, 1648944583, 1648944615, 1648944646, 1648944677, 1648944708, 1648944739, 1648944771, 1648944802, 1648944833, 1648944864, 1648944896, 1648944927, 1648944958, 1648944989, 1648945020, 1648945052, 1648945083, 1648945114, 1648945146, 1648945177, 1648945208, 1648945239, 1648945270, 1648945302, 1648945333, 1648945364, 1648945395, 1648945426, 1648945457, 1648945489, 1648945520, 1648945551, 1648945583, 1648945614, 1648945645, 1648945677, 1648945708, 1648945739, 1648945771, 1648945802, 1648945833, 1648945864, 1648945895, 1648945927, 1648945958, 1648945990, 1648946021, 1648946052, 1648946084, 1648946115, 1648946146, 1648946177, 1648946208, 1648946240, 1648946271, 1648946302, 1648946333, 1648946364, 1648946396, 1648946491, 1648946522, 1648946553, 1648946585, 1648946616, 1648946647, 1648946679, 1648946699, 1648946710, 1648946730, 1648946741, 1648946761, 1648946772, 1648946792, 1648946803, 1648946822, 1648946835, 1648946853, 1648946866, 1648946884, 1648946897, 1648946915, 1648946929, 1648946946, 1648946960, 1648946982, 1648946991, 1648947013, 1648947022, 1648947044, 1648947053, 1648947075, 1648947085, 1648947106, 1648947116, 1648947137, 1648947147, 1648947168, 1648947179, 1648947199, 1648947210, 1648947230, 1648947241, 1648947261, 1648947272, 1648947292, 1648947304, 1648947323, 1648947335, 1648947354, 1648947367, 1648947385, 1648947398, 1648947416, 1648947429, 1648947447, 1648947461, 1648947478, 1648947492, 1648947509, 1648947523, 1648947540, 1648947554, 1648947571, 1648947585, 1648947602, 1648947616, 1648947633, 1648947648, 1648947663, 1648947679, 1648947694, 1648947710, 1648947725, 1648947741, 1648947756, 1648947772, 1648947787, 1648947804, 1648947818, 1648947835, 1648947849, 1648947866, 1648947880, 1648947897, 1648947911, 1648947928, 1648947942, 1648947959, 1648947973, 1648947991, 1648948004, 1648948022, 1648948035, 1648948053, 1648948066, 1648948085, 1648948097, 1648948116, 1648948128, 1648948147, 1648948159, 1648948178, 1648948190, 1648948209, 1648948221, 1648948241, 1648948252, 1648948272, 1648948283, 1648948303, 1648948334, 1648948365, 1648948397, 1648948428, 1648948459, 1648948490, 1648948522, 1648948532, 1648948553, 1648948563, 1648948584, 1648948594, 1648948615, 1648948625, 1648948647, 1648948656, 1648948678, 1648948687, 1648948709, 1648948718, 1648948740, 1648948749, 1648948772, 1648948780, 1648948803, 1648948811, 1648948834, 1648948842, 1648948865, 1648948873, 1648948897, 1648948904, 1648948928, 1648948934, 1648948959, 1648948965, 1648948990, 1648948997, 1648949021, 1648949028, 1648949052, 1648949058, 1648949084, 1648949089, 1648949115, 1648949120, 1648949146, 1648949151, 1648949177, 1648949182, 1648949209, 1648949213, 1648949240, 1648949245, 1648949271, 1648949276, 1648949302, 1648949306, 1648949334, 1648949338, 1648949365, 1648949369, 1648949396, 1648949400, 1648949427, 1648949431, 1648949458, 1648949462, 1648949490, 1648949493, 1648949522, 1648949524, 1648949553, 1648949554, 1648949584, 1648949585, 1648949615, 1648949616, 1648949647, 1648949678, 1648949709, 1648949740, 1648949741, 1648949771, 1648949772, 1648949802, 1648949803, 1648949833, 1648949834, 1648949864, 1648949865, 1648949895, 1648949896, 1648949926, 1648949929, 1648949957, 1648949960, 1648949988, 1648949992, 1648950019, 1648950023, 1648950050, 1648950054, 1648950081, 1648950112, 1648950143, 1648950174, 1648950205, 1648950236, 1648950267, 1648950271, 1648950298, 1648950302, 1648950329, 1648950334, 1648950360, 1648950365, 1648950391, 1648950397, 1648950422, 1648950429, 1648950453, 1648950460, 1648950484, 1648950491, 1648950515, 1648950522, 1648950545, 1648950554, 1648950576, 1648950585, 1648950608, 1648950616, 1648950640, 1648950647, 1648950670, 1648950678, 1648950701, 1648950710, 1648950732, 1648950741, 1648950763, 1648950772, 1648950794, 1648950803, 1648950825, 1648950834, 1648950856, 1648950866, 1648950887, 1648950897, 1648950918, 1648950928, 1648950949, 1648950960, 1648950980, 1648950991, 1648951011, 1648951022, 1648951042, 1648951053, 1648951073, 1648951085, 1648951104, 1648951116, 1648951135, 1648951147, 1648951166, 1648951178, 1648951197, 1648951209, 1648951228, 1648951241, 1648951259, 1648951272, 1648951290, 1648951303, 1648951322, 1648951334, 1648951353, 1648951365, 1648951383, 1648951396, 1648951414, 1648951428, 1648951445, 1648951459, 1648951476, 1648951490, 1648951507, 1648951521, 1648951538, 1648951553, 1648951569, 1648951584, 1648951600, 1648951615, 1648951631, 1648951646, 1648951662, 1648951677, 1648951693, 1648951709, 1648951724, 1648951740, 1648951755, 1648951771, 1648951786, 1648951803, 1648951817, 1648951834, 1648951848, 1648951865, 1648951879, 1648951896, 1648951910, 1648951927, 1648951941, 1648951959, 1648951972, 1648951990, 1648952003, 1648952021, 1648952035, 1648952052, 1648952066, 1648952083, 1648952097, 1648952115, 1648952146, 1648952177, 1648952190, 1648952208, 1648952222, 1648952239, 1648952253, 1648952271, 1648952283, 1648952302, 1648952314, 1648952333, 1648952345, 1648952364, 1648952376, 1648952396, 1648952407, 1648952427, 1648952438, 1648952458, 1648952469, 1648952489, 1648952500, 1648952520, 1648952531, 1648952551, 1648952562, 1648952582, 1648952593, 1648952614, 1648952624, 1648952645, 1648952655, 1648952676, 1648952686, 1648952707, 1648952717, 1648952739, 1648952748, 1648952770, 1648952779, 1648952801, 1648952809, 1648952832, 1648952841, 1648952864, 1648952872, 1648952895, 1648952903, 1648952926, 1648952934, 1648952957, 1648952965, 1648952988, 1648952996, 1648953020, 1648953027, 1648953051, 1648953058, 1648953082, 1648953089, 1648953113, 1648953120, 1648953145, 1648953151, 1648953176, 1648953182, 1648953207, 1648953213, 1648953238, 1648953245, 1648953269, 1648953275, 1648953301, 1648953306, 1648953332, 1648953337, 1648953363, 1648953368, 1648953395, 1648953399, 1648953426, 1648953430, 1648953457, 1648953461, 1648953488, 1648953492, 1648953519, 1648953523, 1648953550, 1648953554, 1648953582, 1648953585, 1648953613, 1648953616, 1648953644, 1648953647, 1648953675, 1648953678, 1648953708, 1648953739, 1648953770, 1648953801, 1648953832, 1648953863, 1648953895, 1648953926, 1648953957, 1648953988, 1648954019, 1648954050, 1648954082, 1648954111, 1648954113, 1648954143, 1648954144, 1648954174, 1648954205, 1648954236, 1648954237, 1648954267, 1648954268, 1648954298, 1648954299, 1648954329, 1648954331, 1648954360, 1648954362, 1648954391, 1648954393, 1648954422, 1648954424, 1648954453, 1648954455, 1648954485, 1648954486, 1648954516, 1648954518, 1648954547, 1648954549, 1648954577, 1648954580, 1648954609, 1648954612, 1648954640, 1648954643, 1648954671, 1648954674, 1648954702, 1648954706, 1648954733, 1648954737, 1648954764, 1648954768, 1648954795, 1648954799, 1648954826, 1648954830, 1648954857, 1648954861, 1648954888, 1648954893, 1648954919, 1648954924, 1648954951, 1648954955, 1648954982, 1648954986, 1648955013, 1648955017, 1648955044, 1648955048, 1648955075, 1648955079, 1648955106, 1648955111, 1648955137, 1648955142, 1648955168, 1648955173, 1648955199, 1648955204, 1648955230, 1648955235, 1648955261, 1648955266, 1648955292, 1648955298, 1648955323, 1648955329, 1648955354, 1648955360, 1648955385, 1648955391, 1648955416, 1648955422, 1648955447, 1648955453, 1648955478, 1648955485, 1648955509, 1648955516, 1648955540, 1648955547, 1648955571, 1648955578, 1648955602, 1648955609, 1648955633, 1648955641, 1648955664, 1648955672, 1648955695, 1648955703, 1648955725, 1648955734, 1648955756, 1648955765, 1648955797, 1648955828, 1648955859, 1648955890, 1648955911, 1648955922, 1648955942, 1648955953, 1648955973, 1648955984, 1648956004, 1648956015, 1648956035, 1648956047, 1648956066, 1648956078, 1648956097, 1648956109, 1648956127, 1648956140, 1648956159, 1648956171, 1648956189, 1648956203, 1648956220, 1648956234, 1648956251, 1648956265, 1648956282, 1648956296, 1648956313, 1648956327, 1648956344, 1648956359, 1648956375, 1648956390, 1648956406, 1648956421, 1648956437, 1648956452, 1648956468, 1648956483, 1648956499, 1648956515, 1648956531, 1648956546, 1648956561, 1648956577, 1648956592, 1648956608, 1648956623, 1648956639, 1648956654, 1648956671, 1648956685, 1648956702, 1648956716, 1648956733, 1648956747, 1648956764, 1648956778, 1648956795, 1648956809, 1648956826, 1648956840, 1648956858, 1648956871, 1648956889, 1648956902, 1648956920, 1648956933, 1648956951, 1648956964, 1648956982, 1648956995, 1648957013, 1648957026, 1648957044, 1648957057, 1648957076, 1648957088, 1648957107, 1648957119, 1648957138, 1648957150, 1648957169, 1648957181, 1648957200, 1648957212, 1648957231, 1648957243, 1648957263, 1648957274, 1648957295, 1648957305, 1648957326, 1648957336, 1648957357, 1648957367, 1648957388, 1648957398, 1648957419, 1648957429, 1648957450, 1648957460, 1648957482, 1648957491, 1648957513, 1648957521, 1648957544, 1648957552, 1648957575, 1648957584, 1648957606, 1648957615, 1648957638, 1648957646, 1648957669, 1648957677, 1648957708, 1648957732, 1648957739, 1648957763, 1648957770, 1648957794, 1648957800, 1648957825, 1648957831, 1648957856, 1648957862, 1648957887, 1648957893, 1648957919, 1648957925, 1648957950, 1648957956, 1648957981, 1648957987, 1648958012, 1648958017, 1648958043, 1648958048, 1648958074, 1648958079, 1648958106, 1648958110, 1648958137, 1648958141, 1648958168, 1648958172, 1648958199, 1648958203, 1648958230, 1648958234, 1648958261, 1648958265, 1648958293, 1648958296, 1648958324, 1648958327, 1648958355, 1648958358, 1648958386, 1648958389, 1648958417, 1648958420, 1648958449, 1648958451, 1648958480, 1648958482, 1648958511, 1648958513, 1648958542, 1648958544, 1648958573, 1648958575, 1648958604, 1648958606, 1648958636, 1648958637, 1648958667, 1648958698, 1648958729, 1648958730, 1648958760, 1648958761, 1648958791, 1648958792, 1648958822, 1648958823, 1648958853, 1648958855, 1648958884, 1648958886, 1648958915, 1648958917, 1648958946, 1648958949, 1648958977, 1648958980, 1648959009, 1648959011, 1648959040, 1648959042, 1648959071, 1648959073, 1648959102, 1648959105, 1648959133, 1648959136, 1648959164, 1648959167, 1648959194, 1648959199, 1648959225, 1648959230, 1648959256, 1648959261, 1648959287, 1648959292, 1648959319, 1648959323, 1648959349, 1648959354, 1648959380, 1648959386, 1648959411, 1648959417, 1648959442, 1648959448, 1648959473, 1648959479, 1648959510, 1648959541, 1648959573, 1648959604, 1648959635, 1648959666, 1648959698, 1648959720, 1648959729, 1648959751, 1648959760, 1648959782, 1648959791, 1648959814, 1648959822, 1648959845, 1648959854, 1648959876, 1648959885, 1648959907, 1648959916, 1648959938, 1648959948, 1648959969, 1648959979, 1648960000, 1648960010, 1648960031, 1648960041, 1648960062, 1648960073, 1648960093, 1648960104, 1648960124, 1648960135, 1648960154, 1648960166, 1648960186, 1648960197, 1648960217, 1648960229, 1648960248, 1648960260, 1648960279, 1648960292, 1648960310, 1648960324, 1648960341, 1648960355, 1648960372, 1648960386, 1648960403, 1648960417, 1648960434, 1648960449, 1648960465, 1648960480, 1648960496, 1648960511, 1648960527, 1648960543, 1648960558, 1648960574, 1648960589, 1648960605, 1648960620, 1648960636, 1648960651, 1648960667, 1648960682, 1648960698, 1648960713, 1648960730, 1648960744, 1648960761, 1648960775, 1648960792, 1648960806, 1648960823, 1648960837, 1648960855, 1648960868, 1648960886, 1648960899, 1648960917, 1648960930, 1648960949, 1648960961, 1648960980, 1648960992, 1648961011, 1648961023, 1648961043, 1648961054, 1648961074, 1648961085, 1648961105, 1648961116, 1648961137, 1648961147, 1648961168, 1648961177, 1648961199, 1648961208, 1648961230, 1648961240, 1648961261, 1648961271, 1648961292, 1648961302, 1648961333, 1648961364, 1648961396, 1648961427, 1648961458, 1648961489, 1648961520, 1648961551, 1648961571, 1648961582, 1648961602, 1648961614, 1648961633, 1648961645, 1648961664, 1648961676, 1648961695, 1648961707, 1648961727, 1648961738, 1648961758, 1648961769, 1648961789, 1648961800, 1648961820, 1648961831, 1648961851, 1648961862, 1648961883, 1648961893, 1648961914, 1648961924, 1648961945, 1648961955, 1648961976, 1648961986, 1648962007, 1648962017, 1648962039, 1648962048, 1648962070, 1648962079, 1648962101, 1648962110, 1648962132, 1648962141, 1648962163, 1648962172, 1648962194, 1648962203, 1648962225, 1648962234, 1648962257, 1648962265, 1648962288, 1648962296, 1648962319, 1648962327, 1648962350, 1648962358, 1648962381, 1648962388, 1648962412, 1648962419, 1648962444, 1648962451, 1648962475, 1648962482, 1648962506, 1648962512, 1648962537, 1648962543, 1648962569, 1648962574, 1648962600, 1648962605, 1648962631, 1648962636, 1648962662, 1648962667, 1648962693, 1648962698, 1648962724, 1648962729, 1648962756, 1648962761, 1648962787, 1648962792, 1648962818, 1648962823, 1648962849, 1648962854, 1648962880, 1648962885, 1648962911, 1648962916, 1648962943, 1648962947, 1648962974, 1648962978, 1648963005, 1648963009, 1648963036, 1648963040, 1648963068, 1648963071, 1648963099, 1648963102, 1648963130, 1648963133, 1648963161, 1648963164, 1648963193, 1648963195, 1648963224, 1648963226, 1648963255, 1648963257, 1648963286, 1648963288, 1648963318, 1648963349, 1648963380, 1648963381, 1648963411, 1648963412, 1648963443, 1648963474, 1648963505, 1648963508, 1648963536, 1648963540, 1648963567, 1648963571, 1648963599, 1648963601, 1648963630, 1648963632, 1648963661, 1648963664, 1648963693, 1648963695, 1648963724, 1648963725, 1648963755, 1648963756, 1648963786, 1648963787, 1648963817, 1648963818, 1648963849, 1648963880, 1648963911, 1648963942, 1648963973, 1648963974, 1648964004, 1648964005, 1648964035, 1648964036, 1648964066, 1648964067, 1648964097, 1648964099, 1648964128, 1648964130, 1648964159, 1648964161, 1648964190, 1648964193, 1648964221, 1648964224, 1648964252, 1648964255, 1648964282, 1648964286, 1648964313, 1648964318, 1648964344, 1648964349, 1648964375, 1648964380, 1648964406, 1648964412, 1648964437, 1648964443, 1648964468, 1648964474, 1648964499, 1648964505, 1648964530, 1648964536, 1648964561, 1648964568, 1648964592, 1648964599, 1648964623, 1648964630, 1648964655, 1648964661, 1648964686, 1648964693, 1648964717, 1648964724, 1648964748, 1648964755, 1648964779, 1648964786, 1648964810, 1648964818, 1648964841, 1648964849, 1648964872, 1648964880, 1648964902, 1648964911, 1648964933, 1648964942, 1648964964, 1648964974, 1648964995, 1648965005, 1648965026, 1648965036, 1648965057, 1648965067, 1648965088, 1648965098, 1648965119, 1648965129, 1648965150, 1648965181, 1648965212, 1648965243, 1648965274, 1648965306, 1648965337, 1648965368, 1648965399, 1648965430, 1648965460, 1648965491, 1648965522, 1648965531, 1648965553, 1648965562, 1648965584, 1648965593, 1648965616, 1648965624, 1648965646, 1648965656, 1648965677, 1648965687, 1648965708, 1648965718, 1648965739, 1648965749, 1648965770, 1648965780, 1648965801, 1648965812, 1648965832, 1648965843, 1648965863, 1648965874, 1648965894, 1648965905, 1648965925, 1648965937, 1648965956, 1648965968, 1648965987, 1648965999, 1648966018, 1648966030, 1648966049, 1648966061, 1648966080, 1648966093, 1648966111, 1648966124, 1648966142, 1648966155, 1648966172, 1648966186, 1648966203, 1648966218, 1648966234, 1648966249, 1648966265, 1648966280, 1648966296, 1648966312, 1648966327, 1648966343, 1648966358, 1648966374, 1648966389, 1648966405, 1648966420, 1648966436, 1648966451, 1648966468, 1648966482, 1648966499, 1648966513, 1648966530, 1648966544, 1648966561, 1648966575, 1648966592, 1648966606, 1648966623, 1648966637, 1648966655, 1648966668, 1648966686, 1648966699, 1648966717, 1648966729, 1648966748, 1648966760, 1648966779, 1648966791, 1648966811, 1648966822, 1648966842, 1648966853, 1648966873, 1648966884, 1648966904, 1648966915, 1648966935, 1648966946, 1648966966, 1648966998, 1648967029, 1648967060, 1648967070, 1648967091, 1648967101, 1648967123, 1648967132, 1648967154, 1648967163, 1648967185, 1648967194, 1648967216, 1648967225, 1648967247, 1648967255, 1648967279, 1648967286, 1648967310, 1648967317, 1648967341, 1648967348, 1648967372, 1648967380, 1648967403, 1648967411, 1648967435, 1648967442, 1648967466, 1648967472, 1648967497, 1648967503, 1648967528, 1648967534, 1648967559, 1648967565, 1648967590, 1648967596, 1648967622, 1648967627, 1648967653, 1648967658, 1648967684, 1648967689, 1648967716, 1648967720, 1648967747, 1648967751, 1648967778, 1648967782, 1648967809, 1648967813, 1648967840, 1648967844, 1648967871, 1648967875, 1648967903, 1648967906, 1648967934, 1648967937, 1648967965, 1648967968, 1648967996, 1648967999, 1648968027, 1648968030, 1648968059, 1648968061, 1648968090, 1648968092, 1648968121, 1648968123, 1648968152, 1648968154, 1648968183, 1648968185, 1648968215, 1648968216, 1648968246, 1648968277, 1648968308, 1648968309, 1648968339, 1648968340, 1648968370, 1648968371, 1648968401, 1648968402, 1648968432, 1648968433, 1648968463, 1648968464, 1648968494, 1648968496, 1648968525, 1648968527, 1648968556, 1648968558, 1648968587, 1648968589, 1648968618, 1648968620, 1648968649, 1648968652, 1648968680, 1648968683, 1648968711, 1648968714, 1648968742, 1648968745, 1648968772, 1648968776, 1648968804, 1648968808, 1648968834, 1648968839, 1648968866, 1648968870, 1648968897, 1648968901, 1648968927, 1648968933, 1648968958, 1648968964, 1648968989, 1648968995, 1648969020, 1648969026, 1648969051, 1648969057, 1648969082, 1648969089, 1648969113, 1648969144, 1648969151, 1648969175, 1648969182, 1648969206, 1648969213, 1648969237, 1648969245, 1648969268, 1648969276, 1648969299, 1648969307, 1648969330, 1648969339, 1648969361, 1648969370, 1648969392, 1648969401, 1648969423, 1648969432, 1648969454, 1648969463, 1648969485, 1648969495, 1648969516, 1648969526, 1648969547, 1648969557, 1648969578, 1648969588, 1648969609, 1648969620, 1648969640, 1648969651, 1648969671, 1648969682, 1648969702, 1648969713, 1648969733, 1648969744, 1648969764, 1648969776, 1648969795, 1648969807, 1648969826, 1648969838, 1648969857, 1648969869, 1648969888, 1648969900, 1648969919, 1648969932, 1648969950, 1648969963, 1648969981, 1648969994, 1648970011, 1648970025, 1648970042, 1648970056, 1648970073, 1648970088, 1648970104, 1648970119, 1648970135, 1648970150, 1648970166, 1648970181, 1648970197, 1648970212, 1648970228, 1648970244, 1648970259, 1648970275, 1648970290, 1648970306, 1648970321, 1648970337, 1648970352, 1648970369, 1648970382, 1648970400, 1648970413, 1648970431, 1648970444, 1648970462, 1648970475, 1648970493, 1648970506, 1648970525, 1648970537, 1648970556, 1648970568, 1648970587, 1648970599, 1648970618, 1648970630, 1648970649, 1648970681, 1648970692, 1648970712, 1648970723, 1648970743, 1648970754, 1648970774, 1648970785, 1648970805, 1648970816, 1648970837, 1648970847, 1648970868, 1648970878, 1648970899, 1648970909, 1648970931, 1648970940, 1648970962, 1648970971, 1648970993, 1648971002, 1648971024, 1648971033, 1648971056, 1648971064, 1648971087, 1648971095, 1648971118, 1648971126, 1648971149, 1648971157, 1648971180, 1648971188, 1648971212, 1648971219, 1648971243, 1648971250, 1648971274, 1648971281, 1648971306, 1648971312, 1648971337, 1648971343, 1648971368, 1648971374, 1648971399, 1648971404, 1648971431, 1648971435, 1648971462, 1648971466, 1648971493, 1648971497, 1648971524, 1648971528, 1648971555, 1648971559, 1648971586, 1648971590, 1648971618, 1648971621, 1648971649, 1648971652, 1648971680, 1648971683, 1648971712, 1648971714, 1648971743, 1648971745, 1648971774, 1648971776, 1648971805, 1648971806, 1648971837, 1648971838, 1648971868, 1648971869, 1648971899, 1648971900, 1648971931, 1648971962, 1648971993, 1648972023, 1648972024, 1648972054, 1648972055, 1648972085, 1648972087, 1648972116, 1648972118, 1648972147, 1648972149, 1648972178, 1648972180, 1648972209, 1648972211, 1648972240, 1648972243, 1648972272, 1648972274, 1648972303, 1648972305, 1648972334, 1648972336, 1648972365, 1648972367, 1648972396, 1648972399, 1648972427, 1648972430, 1648972458, 1648972461, 1648972489, 1648972493, 1648972520, 1648972524, 1648972551, 1648972555, 1648972582, 1648972586, 1648972613, 1648972617, 1648972644, 1648972649, 1648972675, 1648972680, 1648972706, 1648972711, 1648972737, 1648972768, 1648972799, 1648972830, 1648972861, 1648972892, 1648972923, 1648972954, 1648972985, 1648973016, 1648973047, 1648973051, 1648973078, 1648973082, 1648973109, 1648973113, 1648973140, 1648973145, 1648973170, 1648973176, 1648973201, 1648973207, 1648973232, 1648973238, 1648973263, 1648973269, 1648973294, 1648973301, 1648973325, 1648973332, 1648973356, 1648973363, 1648973387, 1648973394, 1648973418, 1648973425, 1648973449, 1648973457, 1648973480, 1648973488, 1648973511, 1648973519, 1648973542, 1648973550, 1648973573, 1648973582, 1648973604, 1648973613, 1648973635, 1648973644, 1648973666, 1648973675, 1648973697, 1648973706, 1648973728, 1648973738, 1648973758, 1648973769, 1648973789, 1648973800, 1648973821, 1648973831, 1648973852, 1648973863, 1648973882, 1648973894, 1648973913, 1648973925, 1648973944, 1648973957, 1648973975, 1648973988, 1648974006, 1648974025, 1648974037, 1648974056, 1648974068, 1648974088, 1648974099, 1648974119, 1648974130, 1648974150, 1648974161, 1648974181, 1648974192, 1648974213, 1648974224, 1648974244, 1648974255, 1648974275, 1648974306, 1648974338, 1648974369, 1648974400, 1648974431, 1648974440, 1648974463, 1648974471, 1648974494, 1648974502, 1648974525, 1648974533, 1648974556, 1648974564, 1648974587, 1648974595, 1648974618, 1648974625, 1648974650, 1648974656, 1648974681, 1648974687, 1648974712, 1648974718, 1648974743, 1648974749, 1648974774, 1648974780, 1648974806, 1648974811, 1648974837, 1648974842, 1648974868, 1648974873, 1648974899, 1648974904, 1648974931, 1648974935, 1648974962, 1648974966, 1648974993, 1648974997, 1648975024, 1648975028, 1648975055, 1648975059, 1648975086, 1648975090, 1648975118, 1648975121, 1648975149, 1648975152, 1648975181, 1648975183, 1648975213, 1648975244, 1648975275, 1648975276, 1648975306, 1648975307, 1648975338, 1648975369, 1648975399, 1648975400, 1648975430, 1648975432, 1648975461, 1648975463, 1648975492, 1648975494, 1648975523, 1648975526, 1648975554, 1648975557, 1648975585, 1648975589, 1648975616, 1648975620, 1648975647, 1648975651, 1648975678, 1648975683, 1648975709, 1648975714, 1648975740, 1648975745, 1648975770, 1648975776, 1648975801, 1648975807, 1648975832, 1648975839, 1648975863, 1648975870, 1648975894, 1648975901, 1648975925, 1648975932, 1648975956, 1648975963, 1648975988, 1648975994, 1648976019, 1648976026, 1648976050, 1648976057, 1648976081, 1648976088, 1648976112, 1648976119, 1648976143, 1648976151, 1648976174, 1648976182, 1648976205, 1648976213, 1648976236, 1648976244, 1648976267, 1648976276, 1648976298, 1648976307, 1648976329, 1648976338, 1648976360, 1648976370, 1648976391, 1648976401, 1648976422, 1648976432, 1648976453, 1648976463, 1648976484, 1648976495, 1648976515, 1648976526, 1648976546, 1648976557, 1648976577, 1648976588, 1648976608, 1648976620, 1648976639, 1648976670, 1648976701, 1648976732, 1648976763, 1648976795, 1648976826, 1648976857, 1648976888, 1648976919, 1648976949, 1648976980, 1648977011, 1648977021, 1648977042, 1648977052, 1648977073, 1648977083, 1648977104, 1648977115, 1648977135, 1648977146, 1648977166, 1648977177, 1648977197, 1648977208, 1648977228, 1648977239, 1648977259, 1648977271, 1648977290, 1648977302, 1648977321, 1648977333, 1648977352, 1648977364, 1648977383, 1648977396, 1648977414, 1648977427, 1648977445, 1648977458, 1648977476, 1648977489, 1648977507, 1648977520, 1648977538, 1648977552, 1648977569, 1648977583, 1648977600, 1648977614, 1648977631, 1648977645, 1648977662, 1648977677, 1648977693, 1648977708, 1648977724, 1648977739, 1648977755, 1648977770, 1648977786, 1648977801, 1648977816, 1648977833, 1648977847, 1648977864, 1648977878, 1648977895, 1648977909, 1648977926, 1648977940, 1648977957, 1648977971, 1648977988, 1648978002, 1648978020, 1648978051, 1648978082, 1648978113, 1648978144, 1648978176, 1648978207, 1648978238, 1648978269, 1648978300, 1648978310, 1648978331, 1648978341, 1648978363, 1648978372, 1648978394, 1648978403, 1648978425, 1648978434, 1648978456, 1648978465, 1648978488, 1648978496, 1648978519, 1648978527, 1648978550, 1648978558, 1648978581, 1648978589, 1648978613, 1648978620, 1648978644, 1648978651, 1648978675, 1648978682, 1648978706, 1648978713, 1648978737, 1648978743, 1648978769, 1648978774, 1648978800, 1648978805, 1648978831, 1648978836, 1648978863, 1648978867, 1648978894, 1648978898, 1648978926, 1648978929, 1648978957, 1648978960, 1648978988, 1648978991, 1648979019, 1648979022, 1648979050, 1648979053, 1648979082, 1648979084, 1648979113, 1648979115, 1648979144, 1648979146, 1648979175, 1648979177, 1648979206, 1648979208, 1648979238, 1648979239, 1648979269, 1648979270, 1648979300, 1648979301, 1648979331, 1648979332, 1648979362, 1648979363, 1648979393, 1648979394, 1648979424, 1648979425, 1648979455, 1648979457, 1648979486, 1648979488, 1648979517, 1648979519, 1648979548, 1648979550, 1648979579, 1648979581, 1648979610, 1648979613, 1648979641, 1648979644, 1648979672, 1648979675, 1648979703, 1648979706, 1648979734, 1648979737, 1648979765, 1648979769, 1648979796, 1648979800, 1648979827, 1648979831, 1648979858, 1648979862, 1648979889, 1648979893, 1648979920, 1648979925, 1648979951, 1648979956, 1648979982, 1648979987, 1648980013, 1648980018, 1648980044, 1648980049, 1648980075, 1648980081, 1648980106, 1648980112, 1648980137, 1648980143, 1648980168, 1648980174, 1648980199, 1648980205, 1648980229, 1648980237, 1648980260, 1648980268, 1648980291, 1648980299, 1648980322, 1648980330, 1648980353, 1648980361, 1648980384, 1648980393, 1648980415, 1648980424, 1648980446, 1648980455, 1648980477, 1648980486, 1648980508, 1648980517, 1648980539, 1648980549, 1648980570, 1648980580, 1648980601, 1648980632, 1648980663, 1648980694, 1648980725, 1648980756, 1648980787, 1648980817, 1648980848, 1648980879, 1648980910, 1648980941, 1648980951, 1648980972, 1648980982, 1648981003, 1648981013, 1648981035, 1648981044, 1648981066, 1648981076, 1648981097, 1648981107, 1648981127, 1648981138, 1648981158, 1648981169, 1648981190, 1648981200, 1648981220, 1648981232, 1648981251, 1648981263, 1648981282, 1648981294, 1648981313, 1648981326, 1648981344, 1648981357, 1648981375, 1648981388, 1648981406, 1648981419, 1648981437, 1648981450, 1648981468, 1648981482, 1648981499, 1648981513, 1648981530, 1648981544, 1648981561, 1648981575, 1648981592, 1648981606, 1648981623, 1648981637, 1648981654, 1648981669, 1648981685, 1648981700, 1648981716, 1648981731, 1648981747, 1648981763, 1648981777, 1648981794, 1648981809, 1648981825, 1648981840, 1648981856, 1648981870, 1648981888, 1648981919, 1648981950, 1648981981, 1648982012, 1648982044, 1648982075, 1648982106, 1648982137, 1648982169, 1648982200, 1648982231, 1648982262, 1648982271, 1648982294, 1648982301, 1648982325, 1648982332, 1648982356, 1648982363, 1648982387, 1648982394, 1648982418, 1648982425, 1648982450, 1648982456, 1648982481, 1648982487, 1648982512, 1648982518, 1648982543, 1648982549, 1648982574, 1648982580, 1648982605, 1648982611, 1648982637, 1648982642, 1648982668, 1648982673, 1648982699, 1648982704, 1648982730, 1648982735, 1648982762, 1648982766, 1648982793, 1648982797, 1648982824, 1648982828, 1648982855, 1648982859, 1648982886, 1648982890, 1648982918, 1648982920, 1648982949, 1648982952, 1648982980, 1648982983, 1648983011, 1648983014, 1648983042, 1648983044, 1648983074, 1648983075, 1648983105, 1648983106, 1648983136, 1648983137, 1648983167, 1648983168, 1648983198, 1648983199, 1648983230, 1648983261, 1648983292, 1648983323, 1648983324, 1648983354, 1648983355, 1648983385, 1648983386, 1648983416, 1648983417, 1648983447, 1648983449, 1648983478, 1648983480, 1648983509, 1648983511, 1648983540, 1648983542, 1648983571, 1648983574, 1648983602, 1648983605, 1648983634, 1648983636, 1648983665, 1648983667, 1648983696, 1648983698, 1648983727, 1648983730, 1648983758, 1648983761, 1648983789, 1648983792, 1648983820, 1648983824, 1648983851, 1648983855, 1648983882, 1648983886, 1648983913, 1648983917, 1648983944, 1648983948, 1648983975, 1648983980, 1648984006, 1648984011, 1648984036, 1648984042, 1648984068, 1648984073, 1648984099, 1648984105, 1648984130, 1648984136, 1648984161, 1648984167, 1648984191, 1648984198, 1648984222, 1648984230, 1648984253, 1648984261, 1648984284, 1648984292, 1648984315, 1648984323, 1648984346, 1648984355, 1648984377, 1648984386, 1648984408, 1648984417, 1648984439, 1648984448, 1648984470, 1648984480, 1648984501, 1648984511, 1648984532, 1648984563, 1648984594, 1648984624, 1648984655, 1648984686, 1648984717, 1648984748, 1648984779, 1648984810, 1648984841, 1648984851, 1648984872, 1648984882, 1648984903, 1648984914, 1648984934, 1648984945, 1648984965, 1648984976, 1648984996, 1648985007, 1648985027, 1648985039, 1648985058, 1648985070, 1648985089, 1648985101, 1648985120, 1648985133, 1648985151, 1648985164, 1648985182, 1648985195, 1648985213, 1648985226, 1648985244, 1648985258, 1648985275, 1648985289, 1648985306, 1648985320, 1648985337, 1648985351, 1648985368, 1648985382, 1648985399, 1648985414, 1648985430, 1648985445, 1648985461, 1648985476, 1648985492, 1648985507, 1648985522, 1648985539, 1648985553, 1648985570, 1648985584, 1648985601, 1648985616, 1648985632, 1648985647, 1648985664, 1648985678, 1648985695, 1648985709, 1648985726, 1648985740, 1648985757, 1648985771, 1648985788, 1648985802, 1648985820, 1648985833, 1648985851, 1648985882, 1648985914, 1648985945, 1648985976, 1648986007, 1648986039, 1648986070, 1648986101, 1648986110, 1648986132, 1648986142, 1648986164, 1648986173, 1648986195, 1648986204, 1648986226, 1648986235, 1648986257, 1648986265, 1648986288, 1648986296, 1648986320, 1648986327, 1648986351, 1648986358, 1648986382, 1648986389, 1648986413, 1648986420, 1648986444, 1648986451, 1648986476, 1648986482, 1648986507, 1648986513, 1648986538, 1648986545, 1648986569, 1648986576, 1648986601, 1648986607, 1648986632, 1648986638, 1648986663, 1648986669, 1648986694, 1648986700, 1648986725, 1648986731, 1648986757, 1648986762, 1648986788, 1648986793, 1648986819, 1648986824, 1648986850, 1648986855, 1648986882, 1648986885, 1648986913, 1648986916, 1648986944, 1648986947, 1648986976, 1648986978, 1648987007, 1648987009, 1648987038, 1648987040, 1648987069, 1648987071, 1648987100, 1648987102, 1648987132, 1648987133, 1648987163, 1648987164, 1648987194, 1648987195, 1648987225, 1648987226, 1648987257, 1648987288, 1648987319, 1648987350, 1648987381, 1648987382, 1648987412, 1648987413, 1648987443, 1648987444, 1648987474, 1648987475, 1648987504, 1648987507, 1648987535, 1648987538, 1648987566, 1648987569, 1648987597, 1648987600, 1648987628, 1648987631, 1648987659, 1648987663, 1648987690, 1648987694, 1648987721, 1648987725, 1648987752, 1648987756, 1648987783, 1648987787, 1648987814, 1648987819, 1648987845, 1648987850, 1648987876, 1648987881, 1648987907, 1648987912, 1648987938, 1648987943, 1648987969, 1648987975, 1648988000, 1648988006, 1648988031, 1648988037, 1648988062, 1648988069, 1648988093, 1648988100, 1648988124, 1648988131, 1648988155, 1648988163, 1648988186, 1648988194, 1648988217, 1648988225, 1648988248, 1648988256, 1648988279, 1648988288, 1648988310, 1648988319, 1648988341, 1648988350, 1648988371, 1648988381, 1648988402, 1648988412, 1648988434, 1648988465, 1648988496, 1648988527, 1648988558, 1648988589, 1648988620, 1648988648, 1648988651, 1648988680, 1648988681, 1648988711, 1648988712, 1648988742, 1648988743, 1648988774, 1648988805, 1648988836, 1648988867, 1648988868, 1648988898, 1648988899, 1648988929, 1648988930, 1648988960, 1648988961, 1648988991, 1648988993, 1648989022, 1648989024, 1648989053, 1648989055, 1648989084, 1648989086, 1648989115, 1648989117, 1648989146, 1648989149, 1648989177, 1648989180, 1648989208, 1648989211, 1648989239, 1648989243, 1648989270, 1648989274, 1648989301, 1648989305, 1648989332, 1648989336, 1648989363, 1648989367, 1648989394, 1648989399, 1648989425, 1648989430, 1648989456, 1648989461, 1648989487, 1648989492, 1648989518, 1648989523, 1648989549, 1648989555, 1648989580, 1648989586, 1648989611, 1648989617, 1648989642, 1648989648, 1648989672, 1648989679, 1648989711, 1648989742, 1648989773, 1648989804, 1648989836, 1648989867, 1648989898, 1648989930, 1648989950, 1648989961, 1648989981, 1648989992, 1648990012, 1648990023, 1648990043, 1648990054, 1648990074, 1648990086, 1648990105, 1648990117, 1648990136, 1648990148, 1648990167, 1648990179, 1648990198, 1648990211, 1648990229, 1648990242, 1648990260, 1648990273, 1648990291, 1648990304, 1648990321, 1648990336, 1648990352, 1648990367, 1648990383, 1648990398, 1648990414, 1648990430, 1648990445, 1648990461, 1648990477, 1648990492, 1648990507, 1648990523, 1648990538, 1648990555, 1648990569, 1648990586, 1648990600, 1648990617, 1648990632, 1648990648, 1648990663, 1648990680, 1648990694, 1648990711, 1648990725, 1648990742, 1648990756, 1648990773, 1648990787, 1648990805, 1648990818, 1648990836, 1648990848, 1648990867, 1648990879, 1648990898, 1648990910, 1648990930, 1648990941, 1648990961, 1648990972, 1648990992, 1648991004, 1648991023, 1648991035, 1648991055, 1648991066, 1648991086, 1648991096, 1648991117, 1648991127, 1648991148, 1648991158, 1648991180, 1648991189, 1648991211, 1648991220, 1648991243, 1648991251, 1648991274, 1648991282, 1648991305, 1648991313, 1648991337, 1648991344, 1648991368, 1648991375, 1648991400, 1648991406, 1648991431, 1648991437, 1648991462, 1648991468, 1648991494, 1648991499, 1648991525, 1648991530, 1648991556, 1648991561, 1648991589, 1648991592, 1648991620, 1648991623, 1648991651, 1648991654, 1648991683, 1648991685, 1648991714, 1648991716, 1648991746, 1648991747, 1648991777, 1648991778, 1648991808, 1648991809, 1648991839, 1648991840, 1648991870, 1648991871, 1648991902, 1648991933, 1648991964, 1648991995, 1648991996, 1648992026, 1648992027, 1648992057, 1648992058, 1648992088, 1648992089, 1648992119, 1648992121, 1648992150, 1648992152, 1648992181, 1648992183, 1648992212, 1648992214, 1648992243, 1648992274, 1648992305, 1648992336, 1648992367, 1648992398, 1648992429, 1648992431, 1648992461, 1648992462, 1648992492, 1648992494, 1648992523, 1648992525, 1648992553, 1648992556, 1648992584, 1648992587, 1648992615, 1648992619, 1648992646, 1648992650, 1648992677, 1648992681, 1648992708, 1648992713, 1648992739, 1648992744, 1648992770, 1648992775, 1648992801, 1648992807, 1648992832, 1648992838, 1648992863, 1648992869, 1648992894, 1648992900, 1648992925, 1648992932, 1648992956, 1648992963, 1648992987, 1648992994, 1648993018, 1648993025, 1648993049, 1648993056, 1648993080, 1648993088, 1648993111, 1648993119, 1648993142, 1648993151, 1648993172, 1648993183, 1648993203, 1648993214, 1648993235, 1648993246, 1648993266, 1648993277, 1648993297, 1648993308, 1648993328, 1648993339, 1648993359, 1648993371, 1648993390, 1648993402, 1648993421, 1648993434, 1648993452, 1648993465, 1648993483, 1648993497, 1648993514, 1648993528, 1648993559, 1648993591, 1648993622, 1648993653, 1648993684, 1648993716, 1648993730, 1648993747, 1648993761, 1648993778, 1648993792, 1648993809, 1648993823, 1648993841, 1648993854, 1648993872, 1648993884, 1648993903, 1648993915, 1648993935, 1648993946, 1648993966, 1648993977, 1648993997, 1648994008, 1648994028, 1648994039, 1648994060, 1648994070, 1648994091, 1648994123, 1648994126, 1648994154, 1648994157, 1648994185, 1648994188, 1648994216, 1648994219, 1648994247, 1648994250, 1648994279, 1648994281, 1648994310, 1648994312, 1648994342, 1648994343, 1648994373, 1648994374, 1648994404, 1648994405, 1648994435, 1648994436, 1648994467, 1648994468, 1648994498, 1648994500, 1648994529, 1648994531, 1648994560, 1648994562, 1648994592, 1648994593, 1648994623, 1648994624, 1648994654, 1648994655, 1648994686, 1648994717, 1648994748, 1648994779, 1648994810, 1648994811, 1648994841, 1648994842, 1648994872, 1648994873, 1648994903, 1648994904, 1648994934, 1648994935, 1648994964, 1648994967, 1648994995, 1648994998, 1648995026, 1648995029, 1648995057, 1648995061, 1648995088, 1648995092, 1648995119, 1648995123, 1648995150, 1648995155, 1648995181, 1648995187, 1648995212, 1648995218, 1648995243, 1648995249, 1648995274, 1648995280, 1648995305, 1648995311, 1648995336, 1648995343, 1648995367, 1648995398, 1648995429, 1648995461, 1648995491, 1648995523, 1648995554, 1648995584, 1648995615, 1648995646, 1648995677, 1648995709, 1648995740, 1648995771, 1648995802, 1648995833, 1648995863, 1648995894, 1648995925, 1648995956, 1648995987, 1648996018, 1648996051, 1648996082, 1648996113, 1648996144, 1648996175, 1648996206, 1648996236, 1648996267, 1648996298, 1648996329, 1648996360, 1648996391, 1648996422, 1648996453, 1648996484, 1648996515, 1648996547, 1648996578, 1648996609, 1648996640, 1648996671, 1648996702, 1648996732, 1648996764, 1648996795, 1648996825, 1648996856, 1648996887, 1648996918, 1648996949, 1648996981, 1648997012, 1648997042, 1648997073, 1648997105, 1648997136, 1648997167, 1648997198, 1648997229, 1648997261, 1648997292, 1648997570, 1648997601, 1648997632, 1648997663, 1648997694, 1648997725, 1648997755, 1648997786, 1648997817, 1648997848, 1648997880, 1648997911, 1648997942, 1648997973, 1648998004, 1648998035, 1648998066, 1648998097, 1648998128, 1648998159, 1648998190, 1648998221, 1648998252, 1648998283, 1648998314, 1648998345, 1648998376, 1648998407, 1648998438, 1648998469, 1648998500, 1648998531, 1648998562, 1648998593, 1648998624, 1648998655, 1648998686, 1648998717, 1648998748, 1648998779, 1648998810, 1648998841, 1648998872, 1648998903, 1648998934, 1648998965, 1648998996, 1648999027, 1648999058, 1648999089, 1648999120, 1648999151, 1648999182, 1648999213, 1648999244, 1648999275, 1648999306, 1648999337, 1648999368, 1648999399, 1648999430, 1648999461, 1648999492, 1648999523, 1648999554, 1648999585, 1648999616, 1648999647, 1648999678, 1648999709, 1648999740, 1648999771, 1648999802, 1648999833, 1648999864, 1648999895, 1648999926, 1648999957, 1648999988, 1649000019, 1649000050, 1649000081, 1649000112, 1649000143, 1649000174, 1649000205, 1649000236, 1649000267, 1649000298, 1649000329, 1649000361, 1649000392, 1649000423, 1649000454, 1649000485, 1649000516, 1649000547, 1649000578, 1649000609, 1649000640, 1649000671, 1649000702, 1649000733, 1649000764, 1649000795, 1649000826, 1649000857, 1649000888, 1649000919, 1649000950, 1649000981, 1649001012, 1649001043, 1649001074, 1649001105, 1649001136, 1649001230, 1649001261, 1649001293, 1649001324, 1649001355, 1649001386, 1649001417, 1649001448, 1649001479, 1649001510, 1649001540, 1649001571, 1649001602, 1649001633, 1649001665, 1649001696, 1649001727, 1649001758, 1649001789, 1649001820, 1649001851, 1649001882, 1649001912, 1649001944, 1649001975, 1649002006, 1649002037, 1649002068, 1649002099, 1649002130, 1649002161, 1649002192, 1649002223, 1649002254, 1649002285, 1649002316, 1649002347, 1649002377, 1649002408, 1649002439, 1649002470, 1649002502, 1649002533, 1649002564, 1649002595, 1649002626, 1649002657, 1649002689, 1649002720, 1649002751, 1649002781, 1649002812, 1649002843, 1649002874, 1649002905, 1649002937, 1649002968, 1649002999, 1649003030, 1649003061, 1649003091, 1649003122, 1649003153, 1649003184, 1649003215, 1649003246, 1649003277, 1649003308, 1649003339, 1649003370, 1649003401, 1649003432, 1649003464, 1649003495, 1649003526, 1649003557, 1649003589, 1649003620, 1649003650, 1649003681, 1649003712, 1649003743, 1649003774, 1649003805, 1649003836, 1649003867, 1649003898, 1649003929, 1649003960, 1649003991, 1649004022, 1649004053, 1649004084, 1649004115, 1649004146, 1649004177, 1649004208, 1649004239, 1649004270, 1649004301, 1649004332, 1649004363, 1649004394, 1649004425, 1649004456, 1649004487, 1649004518, 1649004550, 1649004581, 1649004612, 1649004643, 1649004674, 1649004705, 1649004736, 1649004767, 1649004798, 1649004860, 1649004891, 1649004922, 1649004953, 1649004984, 1649005015, 1649005046, 1649005077, 1649005108, 1649005139, 1649005170, 1649005201, 1649005232, 1649005263, 1649005295, 1649005326, 1649005357, 1649005388, 1649005419, 1649005450, 1649005481, 1649005512, 1649005544, 1649005575, 1649005607, 1649005638, 1649005669, 1649005699, 1649005730, 1649005761, 1649005792, 1649005823, 1649005854, 1649005885, 1649005916, 1649005947, 1649005979, 1649006010, 1649006041, 1649006072, 1649006103, 1649006134, 1649006165, 1649006196, 1649006228, 1649006259, 1649006290, 1649006320, 1649006352, 1649006382, 1649006414, 1649006445, 1649006476, 1649006507, 1649006539, 1649006569, 1649006602, 1649006633, 1649006665, 1649006697, 1649006728, 1649006759, 1649006792, 1649006823, 1649006854, 1649006885, 1649006916, 1649006948, 1649006980, 1649007011, 1649007042, 1649007072, 1649007103, 1649007134, 1649007165, 1649007196, 1649007229, 1649007260, 1649007291, 1649007322, 1649007353, 1649007384, 1649007415, 1649007446, 1649007477, 1649007510, 1649007541, 1649007572, 1649007603, 1649007634, 1649007665, 1649007696, 1649007727, 1649007759, 1649007790, 1649007821, 1649007852, 1649007883, 1649007914, 1649007945, 1649007976, 1649008008, 1649008039, 1649008070, 1649008101, 1649008133, 1649008164, 1649008195, 1649008226, 1649008257, 1649008288, 1649008319, 1649008350, 1649008381, 1649008412, 1649008690, 1649008721, 1649008752, 1649008783, 1649008814, 1649008845, 1649008876, 1649008908, 1649008939, 1649008971, 1649009002, 1649009033, 1649009064, 1649009095, 1649009126, 1649009156, 1649009187, 1649009219, 1649009250, 1649009281, 1649009311, 1649009343, 1649009374, 1649009405, 1649009436, 1649009467, 1649009498, 1649009529, 1649009561, 1649009592, 1649009624, 1649009655, 1649009686, 1649009717, 1649009748, 1649009779, 1649009810, 1649009841, 1649009872, 1649009903, 1649009934, 1649009965, 1649009996, 1649010027, 1649010058, 1649010089, 1649010120, 1649010151, 1649010182, 1649010213, 1649010244, 1649010275, 1649010306, 1649010337, 1649010368, 1649010398, 1649010430, 1649010462, 1649010494, 1649010525, 1649010556, 1649010587, 1649010617, 1649010648, 1649010679, 1649010710, 1649010741, 1649010772, 1649010803, 1649010834, 1649010865, 1649010897, 1649010928, 1649010959, 1649010990, 1649011021, 1649011052, 1649011083, 1649011114, 1649011145, 1649011176, 1649011207, 1649011238, 1649011270, 1649011300, 1649011331, 1649011363, 1649011394, 1649011425, 1649011456, 1649011487, 1649011518, 1649011548, 1649011580, 1649011610, 1649011642, 1649011673, 1649011704, 1649011735, 1649011766, 1649011797, 1649011828, 1649011859, 1649011890, 1649011920, 1649011951, 1649011983, 1649012013, 1649012044, 1649012075, 1649012106, 1649012137, 1649012168, 1649012199, 1649012230, 1649012540, 1649012572, 1649012603, 1649012635, 1649012666, 1649012697, 1649012728, 1649012759, 1649012790, 1649012821, 1649012852, 1649012884, 1649012915, 1649012948, 1649012979, 1649013011, 1649013046, 1649013079, 1649013113, 1649013144, 1649013176, 1649013207, 1649013239, 1649013271, 1649013302, 1649013333, 1649013364, 1649013396, 1649013427, 1649013460, 1649013491, 1649013523, 1649013554, 1649013585, 1649013617, 1649013648, 1649013680, 1649013711, 1649013744, 1649013775, 1649013806, 1649013837, 1649013868, 1649013902, 1649013933, 1649013964, 1649013995, 1649014026, 1649014057, 1649014089, 1649014121, 1649014152, 1649014183, 1649014216, 1649014248, 1649014279, 1649014311, 1649014342, 1649014373, 1649014408, 1649014439, 1649014470, 1649014503, 1649014534, 1649014572, 1649014603, 1649014635, 1649014667, 1649014707, 1649014739, 1649014770, 1649014801, 1649014832, 1649014863, 1649014898, 1649014929, 1649014960, 1649014991, 1649015022, 1649015056, 1649015088, 1649015119, 1649015151, 1649015182, 1649015213, 1649015244, 1649015276, 1649015307, 1649015338, 1649015369, 1649015400, 1649015434, 1649015465, 1649015496, 1649015527, 1649015558, 1649015589, 1649015622, 1649015653, 1649015685, 1649015717, 1649015748, 1649015779, 1649015811, 1649015842, 1649015874, 1649015905, 1649015936, 1649015967, 1649015999, 1649016030, 1649016061, 1649016092, 1649016401, 1649016432, 1649016463, 1649016494, 1649016525, 1649016556, 1649016588, 1649016619, 1649016650, 1649016681, 1649016712, 1649016743, 1649016774, 1649016806, 1649016837, 1649016869, 1649016900, 1649016932, 1649016963, 1649016994, 1649017025, 1649017057, 1649017089, 1649017120, 1649017152, 1649017183, 1649017214, 1649017245, 1649017276, 1649017308, 1649017339, 1649017370, 1649017401, 1649017432, 1649017464, 1649017495, 1649017526, 1649017557, 1649017588, 1649017619, 1649017651, 1649017682, 1649017713, 1649017744, 1649017776, 1649017807, 1649017838, 1649017869, 1649017900, 1649017931, 1649017962, 1649017993, 1649018026, 1649018057, 1649018089, 1649018120, 1649018151, 1649018182, 1649018213, 1649018244, 1649018275, 1649018306, 1649018337, 1649018368, 1649018400, 1649018431, 1649018462, 1649018493, 1649018524, 1649018555, 1649018586, 1649018618, 1649018649, 1649018680, 1649018711, 1649018742, 1649018774, 1649018805, 1649018836, 1649018867, 1649018899, 1649018930, 1649018962, 1649018993, 1649019024, 1649019055, 1649019086, 1649019117, 1649019149, 1649019181, 1649019213, 1649019244, 1649019275, 1649019306, 1649019337, 1649019368, 1649019399, 1649019430, 1649019461, 1649019492, 1649019524, 1649019556, 1649019587, 1649019618, 1649019649, 1649019680, 1649019712, 1649019743, 1649019774, 1649019806, 1649019838, 1649019870, 1649019901, 1649019932, 1649019963, 1649020180, 1649020211, 1649020242, 1649020273, 1649020304, 1649020335, 1649020367, 1649020398, 1649020429, 1649020460, 1649020492, 1649020524, 1649020555, 1649020587, 1649020619, 1649020650, 1649020681, 1649020712, 1649020743, 1649020775, 1649020806, 1649020837, 1649020868, 1649020899, 1649020930, 1649020962, 1649020993, 1649021024, 1649021055, 1649021086, 1649021117, 1649021149, 1649021181, 1649021213, 1649021244, 1649021276, 1649021307, 1649021340, 1649021371, 1649021402, 1649021433, 1649021464, 1649021495, 1649021526, 1649021557, 1649021588, 1649021619, 1649021650, 1649021682, 1649021713, 1649021744, 1649021775, 1649021806, 1649021837, 1649021868, 1649021899, 1649021931, 1649021963, 1649021994, 1649022025, 1649022056, 1649022087, 1649022118, 1649022149, 1649022180, 1649022211, 1649022243, 1649022274, 1649022305, 1649022336, 1649022367, 1649022399, 1649022430, 1649022461, 1649022492, 1649022523, 1649022554, 1649022585, 1649022616, 1649022647, 1649022679, 1649022710, 1649022741, 1649022772, 1649022804, 1649022836, 1649022867, 1649022898, 1649022929, 1649022960, 1649022991, 1649023022, 1649023053, 1649023085, 1649023116, 1649023148, 1649023179, 
        //4
        1649023210, 1649023241, 1649023272, 1649023303, 1649023334, 1649023366, 1649023397, 1649023428, 1649023460, 1649023491, 1649023522, 1649023553, 1649023584, 1649023615, 1649023646, 1649023677, 1649023708, 1649023739, 1649024140, 1649024171, 1649024202, 1649024233, 1649024264, 1649024295, 1649024326, 1649024357, 1649024389, 1649024421, 1649024452, 1649024483, 1649024514, 1649024546, 1649024716, 1649024747, 1649024778, 1649024809, 1649024840, 1649024872, 1649024903, 1649024934, 1649024965, 1649024997, 1649025028, 1649025059, 1649025090, 1649025121, 1649025152, 1649025184, 1649025215, 1649025246, 1649025277, 1649025292, 1649025323, 1649025354, 1649025386, 1649025417, 1649025448, 1649025479, 1649025510, 1649025542, 1649025573, 1649025604, 1649025635, 1649025666, 1649025697, 1649025729, 1649025760, 1649025791, 1649025822, 1649025853, 1649025884, 1649025915, 1649025946, 1649025977, 1649026008, 1649026040, 1649026071, 1649026102, 1649026133, 1649026164, 1649026195, 1649026226, 1649026257, 1649026289, 1649026320, 1649026351, 1649026383, 1649026414, 1649026445, 1649026476, 1649026507, 1649026538, 1649026569, 1649026600, 1649026631, 1649026662, 1649026693, 1649026724, 1649026755, 1649026787, 1649026819, 1649026850, 1649026882, 1649026914, 1649026945, 1649026976, 1649027007, 1649027038, 1649027069, 1649027101, 1649027133, 1649027165, 1649027196, 1649027228, 1649027259, 1649027290, 1649027321, 1649027352, 1649027384, 1649027415, 1649027446, 1649027477, 1649027509, 1649027540, 1649027572, 1649027603, 1649027634, 1649027665, 1649027696, 1649027820, 1649027851, 1649027882, 1649027913, 1649027944, 1649027975, 1649028006, 1649028037, 1649028068, 1649028100, 1649028131, 1649028162, 1649028193, 1649028224, 1649028255, 1649028286, 1649028317, 1649028349, 1649028380, 1649028411, 1649028442, 1649028473, 1649028504, 1649028535, 1649028566, 1649028597, 1649028628, 1649028659, 1649028691, 1649028722, 1649028753, 1649028784, 1649028815, 1649028847, 1649028878, 1649028909, 1649028940, 1649028971, 1649029002, 1649029033, 1649029064, 1649029095, 1649029127, 1649029159, 1649029190, 1649029221, 1649029252, 1649029283, 1649029314, 1649029345, 1649029376, 1649029408, 1649029439, 1649029470, 1649029501, 1649029533, 1649029564, 1649029595, 1649029626, 1649029658, 1649029689, 1649029720, 1649029751, 1649029782, 1649029813, 1649029844, 1649029875, 1649029906, 1649029937, 1649029969, 1649030000, 1649030031, 1649030062, 1649030093, 1649030125, 1649030156, 1649030187, 1649030219, 1649030250, 1649030281, 1649030312, 1649030343, 1649030374, 1649030466, 1649030497, 1649030529, 1649030560, 1649030592, 1649030623, 1649030654, 1649030685, 1649030716, 1649030747, 1649030778, 1649030809, 1649030840, 1649030871, 1649030902, 1649030934, 1649030965, 1649030996, 1649031027, 1649031059, 1649031090, 1649031121, 1649031152, 1649031183, 1649031215, 1649031246, 1649031277, 1649031308, 1649031339, 1649031370, 1649031771, 1649031802, 1649031833, 1649031864, 1649031895, 1649031927, 1649031958, 1649031989, 1649032020, 1649032051, 1649032082, 1649032166, 1649032209, 1649032278, 1649032313, 1649032352, 1649032384, 1649032418, 1649032450, 1649032481, 1649032514, 1649032545, 1649032576, 1649032608, 1649032643, 1649032674, 1649032705, 1649032736, 1649032767, 1649032798, 1649032829, 1649032860, 1649032930, 1649032967, 1649033001, 1649033034, 1649033065, 1649033096, 1649033128, 1649033159, 1649033190, 1649033222, 1649033254, 1649033291, 1649033324, 1649033388, 1649033420, 1649033451, 1649033482, 1649033513, 1649033544, 1649033575, 1649033607, 1649033638, 1649033669, 1649033700, 1649033731, 1649033762, 1649033793, 1649033824, 1649033856, 1649033887, 1649033918, 1649033949, 1649033980, 1649034011, 1649034042, 1649034073, 1649034104, 1649034135, 1649034167, 1649034198, 1649034229, 1649034260, 1649034291, 1649034322, 1649034353, 1649034384, 1649034415, 1649034446, 1649034477, 1649034509, 1649034540, 1649034572, 1649034603, 1649034634, 1649034665, 1649034696, 1649034727, 1649034758, 1649034789, 1649034820, 1649034851, 1649034882, 1649034913, 1649034944, 1649034975, 1649035006, 1649035037, 1649035069, 1649035100, 1649035131, 1649035162, 1649035193, 1649035224, 1649035255, 1649035286, 1649035317, 1649035410, 1649035441, 1649035473, 1649035504, 1649035535, 1649035566, 1649035597, 1649035628, 1649035659, 1649035690, 1649035721, 1649035752, 1649035783, 1649035814, 1649035845, 1649035876, 1649035908, 1649035939, 1649035970, 1649036001, 1649036032, 1649036064, 1649036095, 1649036126, 1649036157, 1649036188, 1649036219, 1649036250, 1649036281, 1649036313, 1649036344, 1649036375, 1649036405, 1649036437, 1649036468, 1649036499, 1649036530, 1649036561, 1649036592, 1649036623, 1649036654, 1649036685, 1649036716, 1649036747, 1649036778, 1649036809, 1649036840, 1649036871, 1649036902, 1649036934, 1649036965, 1649036996, 1649037027, 1649037058, 1649037089, 1649037120, 1649037151, 1649037182, 1649037213, 1649037244, 1649037275, 1649037307, 1649037338, 1649037369, 1649037400, 1649037431, 1649037463, 1649037494, 1649037525, 1649037556, 1649037587, 1649037618, 1649037649, 1649037680, 1649037712, 1649037743, 1649037775, 1649037806, 1649037837, 1649037868, 1649037899, 1649037930, 1649037962, 1649037993, 1649038024, 1649038055, 1649038086, 1649038117, 1649038148, 1649038179, 1649038210, 1649038241, 1649038272, 1649038303, 1649038334, 1649038365, 1649038396, 1649038427, 1649038458, 1649038490, 1649038521, 1649038552, 1649038583, 1649038614, 1649038645, 1649038676, 1649038708, 1649038740, 1649038771, 1649038802, 1649038833, 1649038864, 1649038895, 1649038926, 1649038957, 1649039050, 1649039082, 1649039113, 1649039145, 1649039176, 1649039207, 1649039238, 1649039269, 1649039300, 1649039332, 1649039363, 1649039394, 1649039425, 1649039456, 1649039487, 1649039518, 1649039549, 1649039580, 1649039611, 1649039642, 1649039674, 1649039704, 1649039736, 1649039766, 1649039798, 1649039829, 1649039860, 1649039891, 1649039922, 1649039953, 1649039984, 1649040015, 1649040046, 1649040077, 1649040108, 1649040139, 1649040170, 1649040201, 1649040233, 1649040264, 1649040295, 1649040326, 1649040357, 1649040388, 1649040419, 1649040450, 1649040481, 1649040512, 1649040543, 1649040574, 1649040605, 1649040636, 1649040667, 1649040698, 1649040729, 1649040761, 1649040792, 1649040823, 1649040854, 1649040885, 1649040916, 1649040947, 1649040978, 1649041009, 1649041040, 1649041071, 1649041102, 1649041133, 1649041164, 1649041196, 1649041227, 1649041258, 1649041289, 1649041320, 1649041351, 1649041382, 1649041413, 1649041444, 1649041475, 1649041507, 1649041538, 1649041569, 1649041600, 1649041631, 1649041662, 1649041693, 1649041724, 1649041756, 1649041787, 1649041818, 1649041849, 1649041881, 1649041912, 1649041943, 1649041974, 1649042005, 1649042036, 1649042067, 1649042098, 1649042129, 1649042160, 1649042191, 1649042223, 1649042254, 1649042285, 1649042316, 1649042347, 1649042378, 1649042409, 1649042440, 1649042471, 1649042502, 1649042533, 1649042565, 1649042596, 1649042751, 1649042782, 1649042813, 1649042844, 1649042875, 1649042906, 1649042938, 1649042969, 1649043000, 1649043031, 1649043062, 1649043093, 1649043124, 1649043155, 1649043186, 1649043217, 1649043248, 1649043280, 1649043311, 1649043342, 1649043373, 1649043404, 1649043435, 1649043466, 1649043497, 1649043528, 1649043559, 1649043590, 1649043621, 1649043652, 1649043683, 1649043714, 1649043745, 1649043777, 1649043808, 1649043840, 1649043871, 1649043902, 1649043933, 1649043964, 1649043995, 1649044026, 1649044057, 1649044088, 1649044119, 1649044150, 1649044181, 1649044212, 1649044243, 1649044274, 1649044305, 1649044337, 1649044368, 1649044399, 1649044430, 1649044461, 1649044492, 1649044523, 1649044554, 1649044585, 1649044617, 1649044648, 1649044679, 1649044710, 1649044741, 1649044772, 1649044803, 1649044834, 1649044866, 1649044897, 1649044928, 1649044959, 1649044990, 1649045021, 1649045052, 1649045083, 1649045114, 1649045145, 1649045176, 1649045207, 1649045239, 1649045270, 1649045301, 1649045332, 1649045363, 1649045394, 1649045425, 1649045456, 1649045487, 1649045518, 1649045549, 1649045581, 1649045612, 1649045643, 1649045674, 1649045705, 1649045736, 1649045767, 1649045798, 1649045829, 1649045860, 1649045891, 1649045922, 1649045953, 1649045985, 1649046016, 1649046047, 1649046078, 1649046109, 1649046140, 1649046171, 1649046202, 1649046233, 1649046265, 1649046296, 1649046450, 1649046481, 1649046512, 1649046543, 1649046574, 1649046605, 1649046637, 1649046668, 1649046699, 1649046730, 1649046761, 1649046792, 1649046823, 1649046854, 1649046885, 1649046916, 1649046947, 1649046979, 1649047011, 1649047042, 1649047073, 1649047104, 1649047135, 1649047166, 1649047197, 1649047228, 1649047259, 1649047290, 1649047321, 1649047353, 1649047384, 1649047415, 1649047446, 1649047477, 1649047508, 1649047539, 1649047570, 1649047601, 1649047632, 1649047663, 1649047694, 1649047725, 1649047756, 1649047787, 1649047819, 1649047849, 1649047880, 1649047911, 1649047943, 1649047974, 1649048005, 1649048036, 1649048067, 1649048098, 1649048129, 1649048160, 1649048192, 1649048223, 1649048254, 1649048285, 1649048316, 1649048347, 1649048378, 1649048409, 1649048440, 1649048471, 1649048502, 1649048533, 1649048564, 1649048595, 1649048626, 1649048657, 1649048688, 1649048719, 1649048751, 1649048781, 1649048813, 1649048844, 1649048875, 1649048906, 1649048937, 1649048968, 1649048999, 1649049030, 1649049061, 1649049092, 1649049123, 1649049154, 1649049185, 1649049217, 1649049248, 1649049279, 1649049310, 1649049341, 1649049372, 1649049403, 1649049434, 1649049465, 1649049496, 1649049527, 1649049559, 1649049590, 1649049621, 1649049652, 1649049683, 1649049714, 1649049745, 1649049776, 1649049807, 1649049838, 1649049869, 1649049900, 1649049931, 1649049962, 1649049993, 1649050240, 1649050271, 1649050302, 1649050333, 1649050364, 1649050395, 1649050426, 1649050457, 1649050488, 1649050519, 1649050550, 1649050581, 1649050612, 1649050643, 1649050674, 1649050705, 1649050737, 1649050768, 1649050799, 1649050830, 1649050861, 1649050892, 1649050923, 1649050954, 1649050985, 1649051016, 1649051047, 1649051078, 1649051110, 1649051141, 1649051172, 1649051203, 1649051234, 1649051265, 1649051296, 1649051327, 1649051358, 1649051389, 1649051420, 1649051451, 1649051482, 1649051513, 1649051544, 1649051575, 1649051607, 1649051638, 1649051669, 1649051700, 1649051731, 1649051762, 1649051793, 1649051824, 1649051855, 1649051886, 1649051918, 1649051949, 1649051980, 1649052011, 1649052042, 1649052073, 1649052104, 1649052135, 1649052166, 1649052197, 1649052228, 1649052259, 1649052290, 1649052321, 1649052352, 1649052383, 1649052414, 1649052445, 1649052476, 1649052507, 1649052538, 1649052569, 1649052601, 1649052632, 1649052663, 1649052694, 1649052725, 1649052756, 1649052787, 1649052818, 1649052849, 1649052880, 1649052911, 1649052942, 1649052973, 1649053004, 1649053035, 1649053067, 1649053098, 1649053129, 1649053160, 1649053191, 1649053222, 1649053253, 1649053284, 1649053315, 1649053346, 1649053377, 1649053408, 1649053439, 1649053470, 1649053501, 1649053532, 1649053563, 1649053594, 1649053625, 1649053656, 1649053687, 1649053718, 1649053749, 1649053780, 1649054180, 1649054211, 1649054242, 1649054274, 1649054304, 1649054335, 1649054367, 1649054398, 1649054429, 1649054460, 1649054491, 1649054522, 1649054553, 1649054584, 1649054615, 1649054646, 1649054677, 1649054708, 1649054739, 1649054770, 1649054802, 1649054833, 1649054864, 1649054895, 1649054926, 1649054957, 1649054988, 1649055019, 1649055050, 1649055081, 1649055112, 1649055143, 1649055174, 1649055205, 1649055236, 1649055267, 1649055299, 1649055330, 1649055361, 1649055392, 1649055423, 1649055454, 1649055485, 1649055516, 1649055547, 1649055578, 1649055609, 1649055640, 1649055671, 1649055702, 1649055733, 1649055764, 1649055795, 1649055826, 1649055857, 1649055888, 1649055920, 1649055951, 1649055982, 1649056013, 1649056044, 1649056075, 1649056106, 1649056137, 1649056168, 1649056199, 1649056230, 1649056261, 1649056292, 1649056323, 1649056354, 1649056386, 1649056417, 1649056448, 1649056479, 1649056510, 1649056541, 1649056572, 1649056603, 1649056634, 1649056665, 1649056696, 1649056727, 1649056758, 1649056789, 1649056821, 1649056852, 1649056883, 1649056914, 1649056945, 1649056976, 1649057007, 1649057038, 1649057069, 1649057100, 1649057131, 1649057162, 1649057193, 1649057224, 1649057255, 1649057286, 1649057317, 1649057348, 1649057379, 1649057410, 1649057441, 1649057472, 1649057503, 1649057534, 1649057566, 1649057597, 1649057628, 1649057659, 1649057690, 1649057721, 1649058090, 1649058121, 1649058153, 1649058184, 1649058215, 1649058246, 1649058277, 1649058308, 1649058339, 1649058370, 1649058401, 1649058432, 1649058463, 1649058494, 1649058525, 1649058556, 1649058587, 1649058618, 1649058649, 1649058680, 1649058712, 1649058743, 1649058774, 1649058805, 1649058836, 1649058867, 1649058898, 1649058929, 1649058960, 1649058991, 1649059022, 1649059053, 1649059084, 1649059115, 1649059146, 1649059177, 1649059208, 1649059239, 1649059270, 1649059301, 1649059332, 1649059363, 1649059394, 1649059425, 1649059456, 1649059488, 1649059519, 1649059550, 1649059581, 1649059612, 1649059643, 1649059674, 1649059705, 1649059736, 1649059767, 1649059798, 1649059829, 1649059860, 1649059892, 1649059923, 1649059954, 1649059985, 1649060016, 1649060047, 1649060078, 1649060109, 1649060140, 1649060171, 1649060202, 1649060233, 1649060264, 1649060295, 1649060327, 1649060358, 1649060389, 1649060420, 1649060451, 1649060482, 1649060513, 1649060544, 1649060575, 1649060606, 1649060637, 1649060669, 1649060700, 1649060731, 1649060762, 1649060793, 1649060824, 1649060855, 1649060886, 1649060917, 1649060948, 1649060979, 1649061010, 1649061041, 1649061072, 1649061103, 1649061134, 1649061165, 1649061196, 1649061228, 1649061259, 1649061290, 1649061321, 1649061352, 1649061383, 1649061414, 1649061445, 1649061476, 1649061507, 1649061538, 1649061569, 1649061600, 1649061631, 1649061970, 1649062001, 1649062032, 1649062063, 1649062094, 1649062125, 1649062156, 1649062187, 1649062218, 1649062249, 1649062281, 1649062312, 1649062344, 1649062375, 1649062406, 1649062437, 1649062468, 1649062500, 1649062531, 1649062562, 1649062593, 1649062624, 1649062655, 1649062686, 1649062717, 1649062748, 1649062779, 1649062810, 1649062841, 1649062872, 1649062904, 1649062935, 1649062966, 1649062997, 1649063028, 1649063059, 1649063090, 1649063121, 1649063152, 1649063183, 1649063214, 1649063246, 1649063277, 1649063308, 1649063339, 1649063370, 1649063401, 1649063432, 1649063463, 1649063494, 1649063525, 1649063556, 1649063587, 1649063618, 1649063650, 1649063681, 1649063712, 1649063743, 1649063774, 1649063805, 1649063837, 1649063868, 1649063899, 1649063930, 1649063961, 1649063992, 1649064023, 1649064054, 1649064085, 1649064116, 1649064147, 1649064178, 1649064209, 1649064240, 1649064271, 1649064302, 1649064333, 1649064364, 1649064395, 1649064426, 1649064457, 1649064488, 1649064519, 1649064550, 1649064581, 1649064612, 1649064644, 1649064675, 1649064706, 1649064737, 1649064768, 1649064799, 1649064830, 1649064861, 1649064892, 1649064923, 1649064954, 1649064985, 1649065016, 1649065048, 1649065079, 1649065110, 1649065141, 1649065172, 1649065203, 1649065234, 1649065265, 1649065296, 1649065327, 1649065358, 1649065389, 1649065420, 1649065451, 1649065483, 1649065514, 1649065960, 1649065991, 1649066022, 1649066053, 1649066084, 1649066115, 1649066146, 1649066178, 1649066209, 1649066240, 1649066271, 1649066302, 1649066333, 1649066364, 1649066395, 1649066426, 1649066457, 1649066488, 1649066519, 1649066550, 1649066582, 1649066613, 1649066644, 1649066675, 1649066706, 1649066737, 1649066768, 1649066801, 1649066832, 1649066864, 1649066895, 1649066926, 1649066957, 1649066988, 1649067019, 1649067050, 1649067081, 1649067112, 1649067143, 1649067174, 1649067206, 1649067237, 1649067268, 1649067299, 1649067330, 1649067361, 1649067392, 1649067423, 1649067454, 1649067485, 1649067516, 1649067547, 1649067578, 1649067609, 1649067640, 1649067671, 1649067702, 1649067733, 1649067764, 1649067795, 1649067827, 1649067858, 1649067889, 1649067920, 1649067951, 1649067982, 1649068013, 1649068044, 1649068075, 1649068106, 1649068137, 1649068168, 1649068199, 1649068230, 1649068262, 1649068293, 1649068324, 1649068355, 1649068386, 1649068417, 1649068448, 1649068479, 1649068511, 1649068542, 1649068573, 1649068605, 1649068636, 1649068667, 1649068698, 1649068729, 1649068760, 1649068791, 1649068822, 1649068853, 1649068884, 1649068916, 1649068947, 1649068978, 1649069009, 1649069040, 1649069071, 1649069102, 1649069133, 1649069164, 1649069196, 1649069227, 1649069258, 1649069289, 1649069320, 1649069351, 1649069382, 1649069413, 1649069444, 1649069475, 1649069506, 1649069630, 1649069661, 1649069692, 1649069724, 1649069755, 1649069786, 1649069817, 1649069848, 1649069879, 1649069910, 1649069941, 1649069972, 1649070003, 1649070034, 1649070065, 1649070096, 1649070127, 1649070159, 1649070190, 1649070221, 1649070252, 1649070283, 1649070314, 1649070345, 1649070376, 1649070407, 1649070438, 1649070469, 1649070500, 1649070531, 1649070562, 1649070594, 1649070625, 1649070656, 1649070687, 1649070718, 1649070749, 1649070780, 1649070812, 1649070843, 1649070874, 1649070905, 1649070936, 1649070967, 1649070998, 1649071029, 1649071061, 1649071092, 1649071123, 1649071154, 1649071185, 1649071216, 1649071247, 1649071278, 1649071309, 1649071340, 1649071372, 1649071403, 1649071434, 1649071465, 1649071496, 1649071527, 1649071558, 1649071589, 1649071620, 1649071651, 1649071682, 1649071713, 1649071744, 1649071775, 1649071807, 1649071838, 1649071869, 1649071900, 1649071931, 1649071963, 1649071993, 1649072025, 1649072056, 1649072087, 1649072118, 1649072149, 1649072180, 1649072211, 1649072242, 1649072273, 1649072304, 1649072336, 1649072367, 1649072398, 1649072429, 1649072460, 1649072491, 1649072522, 1649072553, 1649072584, 1649072615, 1649072646, 1649072677, 1649072708, 1649072739, 1649072770, 1649072801, 1649072833, 1649072864, 1649072895, 1649072926, 1649072957, 1649072988, 1649073019, 1649073050, 1649073081, 1649073112, 1649073143, 1649073175, 1649073390, 1649073422, 1649073453, 1649073484, 1649073515, 1649073546, 1649073577, 1649073608, 1649073639, 1649073670, 1649073701, 1649073732, 1649073763, 1649073795, 1649073826, 1649073857, 1649073888, 1649073919, 1649073950, 1649073981, 1649074012, 1649074043, 1649074074, 1649074105, 1649074136, 1649074167, 1649074198, 1649074229, 1649074261, 1649074292, 1649074324, 1649074355, 1649074386, 1649074417, 1649074448, 1649074479, 1649074510, 1649074541, 1649074572, 1649074603, 1649074634, 1649074665, 1649074696, 1649074727, 1649074758, 1649074789, 1649074820, 1649074851, 1649074882, 1649074914, 1649074945, 1649074976, 1649075007, 1649075038, 1649075069, 1649075100, 1649075131, 1649075162, 1649075193, 1649075224, 1649075255, 1649075286, 1649075317, 1649075348, 1649075379, 1649075410, 1649075441, 1649075473, 1649075504, 1649075535, 1649075566, 1649075597, 1649075628, 1649075659, 1649075690, 1649075721, 1649075752, 1649075783, 1649075814, 1649075845, 1649075876, 1649075907, 1649075938, 1649075969, 1649076000, 1649076031, 1649076062, 1649076094, 1649076125, 1649076156, 1649076187, 1649076218, 1649076249, 1649076280, 1649076311, 1649076342, 1649076373, 1649076404, 1649076435, 1649076466, 1649076497, 1649076528, 1649076559, 1649076590, 1649076621, 1649076652, 1649076683, 1649076715, 1649076746, 1649076777, 1649076808, 1649076839, 1649076870, 1649076901, 1649076932, 1649077240, 1649077271, 1649077302, 1649077334, 1649077365, 1649077396, 1649077428, 1649077459, 1649077490, 1649077521, 1649077552, 1649077583, 1649077614, 1649077645, 1649077676, 1649077707, 1649077738, 1649077769, 1649077800, 1649077831, 1649077862, 1649077893, 1649077925, 1649077956, 1649077987, 1649078018, 1649078049, 1649078080, 1649078111, 1649078142, 1649078173, 1649078204, 1649078235, 1649078267, 1649078298, 1649078329, 1649078360, 1649078391, 1649078422, 1649078453, 1649078484, 1649078516, 1649078547, 1649078578, 1649078609, 1649078640, 1649078671, 1649078702, 1649078734, 1649078765, 1649078796, 1649078827, 1649078858, 1649078889, 1649078920, 1649078951, 1649078982, 1649079014, 1649079045, 1649079076, 1649079107, 1649079138, 1649079169, 1649079200, 1649079231, 1649079263, 1649079294, 1649079325, 1649079356, 1649079388, 1649079419, 1649079450, 1649079481, 1649079512, 1649079543, 1649079574, 1649079605, 1649079636, 1649079667, 1649079698, 1649079729, 1649079760, 1649079791, 1649079823, 1649079854, 1649079885, 1649079916, 1649079947, 1649079978, 1649080009, 1649080040, 1649080071, 1649080102, 1649080133, 1649080164, 1649080195, 1649080226, 1649080257, 1649080288, 1649080319, 1649080351, 1649080382, 1649080413, 1649080444, 1649080475, 1649080506, 1649080537, 1649080568, 1649080599, 1649080631, 1649080662, 1649080693, 1649080724, 1649080755, 1649080786, 1649080910, 1649080941, 1649080972, 1649081003, 1649081034, 1649081065, 1649081096, 1649081127, 1649081158, 1649081190, 1649081221, 1649081252, 1649081283, 1649081314, 1649081346, 1649081377, 1649081408, 1649081440, 1649081471, 1649081502, 1649081533, 1649081564, 1649081595, 1649081627, 1649081658, 1649081689, 1649081720, 1649081751, 1649081782, 1649081813, 1649081844, 1649081875, 1649081907, 1649081938, 1649081969, 1649082000, 1649082031, 1649082062, 1649082093, 1649082125, 1649082156, 1649082187, 1649082218, 1649082249, 1649082280, 1649082311, 1649082342, 1649082374, 1649082406, 1649082437, 1649082468, 1649082499, 1649082530, 1649082561, 1649082592, 1649082623, 1649082654, 1649082685, 1649082716, 1649082747, 1649082778, 1649082810, 1649082841, 1649082872, 1649082903, 1649082934, 1649082965, 1649082996, 1649083027, 1649083058, 1649083090, 1649083121, 1649083152, 1649083183, 1649083215, 1649083246, 1649083277, 1649083308, 1649083339, 1649083370, 1649083402, 1649083433, 1649083464, 1649083495, 1649083526, 1649083557, 1649083588, 1649083619, 1649083651, 1649083683, 1649083715, 1649083746, 1649083777, 1649083808, 1649083839, 1649083870, 1649083901, 1649083932, 1649083963, 1649083994, 1649084026, 1649084057, 1649084088, 1649084119, 1649084150, 1649084182, 1649084213, 1649084244, 1649084275, 1649084306, 1649084337, 1649084369, 1649084400, 1649084431, 1649084462, 1649084679, 1649084710, 1649084741, 1649084772, 1649084804, 1649084835, 1649084866, 1649084897, 1649084928, 1649084960, 1649084991, 1649085022, 1649085053, 1649085084, 1649085115, 1649085146, 1649085178, 1649085209, 1649085240, 1649085271, 1649085302, 1649085333, 1649085364, 1649085395, 1649085426, 1649085457, 1649085488, 1649085519, 1649085550, 1649085582, 1649085613, 1649085644, 1649085675, 1649085706, 1649085737, 1649085769, 1649085800, 1649085831, 1649085862, 1649085893, 1649085925, 1649085956, 1649085987, 1649086018, 1649086049, 1649086080, 1649086111, 1649086143, 1649086174, 1649086205, 1649086236, 1649086268, 1649086299, 1649086331, 1649086362, 1649086393, 1649086424, 1649086455, 1649086486, 1649086518, 1649086549, 1649086580, 1649086611, 1649086642, 1649086674, 1649086705, 1649086736, 1649086767, 1649086798, 1649086829, 1649086860, 1649086892, 1649086923, 1649086954, 1649086985, 1649087017, 1649087049, 1649087080, 1649087111, 1649087142, 1649087174, 1649087205, 1649087236, 1649087267, 1649087298, 1649087329, 1649087360, 1649087391, 1649087423, 1649087454, 1649087485, 1649087516, 1649087547, 1649087578, 1649087609, 1649087640, 1649087671, 1649087703, 1649087734, 1649087765, 1649087796, 1649087827, 1649087858, 1649087889, 1649087921, 1649087952, 1649087983, 1649088014, 1649088045, 1649088077, 1649088108, 1649088139, 1649088171, 1649088202, 1649088233, 1649088420, 1649088451, 1649088482, 1649088513, 1649088545, 1649088576, 1649088607, 1649088638, 1649088670, 1649088701, 1649088733, 1649088764, 1649088795, 1649088827, 1649088858, 1649088890, 1649088922, 1649088953, 1649088984, 1649089015, 1649089046, 1649089077, 1649089108, 1649089139, 1649089170, 1649089202, 1649089233, 1649089264, 1649089295, 1649089326, 1649089357, 1649089389, 1649089421, 1649089452, 1649089483, 1649089514, 1649089545, 1649089576, 1649089608, 1649089639, 1649089671, 1649089702, 1649089734, 1649089765, 1649089796, 1649089827, 1649089858, 1649089890, 1649089921, 1649089952, 1649089983, 1649090014, 1649090045, 1649090076, 1649090107, 1649090138, 1649090169, 1649090201, 1649090232, 1649090263, 1649090294, 1649090325, 1649090357, 1649090388, 1649090420, 1649090451, 1649090482, 1649090513, 1649090544, 1649090575, 1649090607, 1649090638, 1649090669, 1649090700, 1649090732, 1649090763, 1649090794, 1649090827, 1649090858, 1649090889, 1649090920, 1649090951, 1649090982, 1649091013, 1649091045, 1649091076, 1649091107, 1649091138, 1649091169, 1649091200, 1649091231, 1649091262, 1649091294, 1649091325, 1649091356, 1649091387, 1649091418, 1649091449, 1649091480, 1649091511, 1649091542, 1649091573, 1649091604, 1649091637, 1649091668, 1649091699, 1649091730, 1649091761, 1649091792, 1649091824, 1649091855, 1649091886, 1649091917, 1649091949, 1649091980, 1649092350, 1649092381, 1649092412, 1649092444, 1649092475, 1649092506, 1649092537, 1649092568, 1649092599, 1649092630, 1649092661, 1649092694, 1649092725, 1649092757, 1649092788, 1649092819, 1649092850, 1649092881, 1649092913, 1649092944, 1649092975, 1649093006, 1649093037, 1649093069, 1649093100, 1649093132, 1649093163, 1649093195, 1649093227, 1649093258, 1649093289, 1649093320, 1649093351, 1649093382, 1649093413, 1649093445, 1649093476, 1649093508, 1649093539, 1649093570, 1649093601, 1649093633, 1649093664, 1649093695, 1649093726, 1649093757, 1649093789, 1649093820, 1649093851, 1649093882, 1649093913, 1649093945, 1649093976, 1649094008, 1649094039, 1649094070, 1649094101, 1649094132, 1649094163, 1649094196, 1649094228, 1649094259, 1649094291, 1649094322, 1649094353, 1649094384, 1649094416, 1649094447, 1649094478, 1649094509, 1649094540, 1649094571, 1649094604, 1649094635, 1649094666, 1649094697, 1649094728, 1649094760, 1649094791, 1649094823, 1649094854, 1649094885, 1649094916, 1649094947, 1649094979, 1649095010, 1649095041, 1649095073, 1649095104, 1649095135, 1649095166, 1649095197, 1649095229, 1649095260, 1649095291, 1649095322, 1649095353, 1649095384, 1649095417, 1649095448, 1649095479, 1649095511, 1649095542, 1649095573, 1649095606, 1649095638, 1649095670, 1649095701, 1649095732, 1649095764, 1649095795, 1649095826, 1649095858, 1649095889, 1649095982, 1649096013, 1649096045, 1649096076, 1649096108, 1649096139, 1649096170, 1649096202, 1649096233, 1649096264, 1649096295, 1649096326, 1649096357, 1649096389, 1649096420, 1649096451, 1649096482, 1649096513, 1649096544, 1649096575, 1649096606, 1649096637, 1649096669, 1649096700, 1649096731, 1649096762, 1649096793, 1649096824, 1649096855, 1649096887, 1649096918, 1649096949, 1649096980, 1649097012, 1649097043, 1649097074, 1649097105, 1649097137, 1649097168, 1649097199, 1649097230, 1649097261, 1649097295, 1649097327, 1649097358, 1649097389, 1649097420, 1649097451, 1649097483, 1649097514, 1649097545, 1649097576, 1649097607, 1649097639, 1649097670, 1649097701, 1649097732, 1649097764, 1649097796, 1649097827, 1649097858, 1649097890, 1649097921, 1649097952, 1649097983, 1649098014, 1649098046, 1649098077, 1649098108, 1649098140, 1649098172, 1649098203, 1649098234, 1649098265, 1649098296, 1649098327, 1649098359, 1649098390, 1649098421, 1649098452, 1649098483, 1649098515, 1649098546, 1649098577, 1649098608, 1649098640, 1649098671, 1649098702, 1649098734, 1649098765, 1649098796, 1649098827, 1649098858, 1649098890, 1649098921, 1649098952, 1649098983, 1649099014, 1649099045, 1649099077, 1649099108, 1649099140, 1649099171, 1649099207, 1649099238, 1649099270, 1649099301, 1649099332, 1649099364, 1649099395, 1649099426, 1649099457, 1649099488, 1649099519, 1649099550, 1649099830, 1649099861, 1649099892, 1649099923, 1649099955, 1649099987, 1649100018, 1649100050, 1649100081, 1649100112, 1649100143, 1649100176, 1649100207, 1649100239, 1649100270, 1649100301, 1649100334, 1649100365, 1649100397, 1649100428, 1649100459, 1649100490, 1649100521, 1649100553, 1649100584, 1649100615, 1649100647, 1649100678, 1649100709, 1649100740, 1649100771, 1649100803, 1649100835, 1649100866, 1649100897, 1649100929, 1649100960, 1649100991, 1649101022, 1649101053, 1649101084, 1649101116, 1649101147, 1649101179, 1649101210, 1649101241, 1649101273, 1649101304, 1649101335, 1649101367, 1649101398, 1649101430, 1649101465, 1649101496, 1649101527, 1649101559, 1649101591, 1649101622, 1649101654, 1649101685, 1649101716, 1649101747, 1649101779, 1649101810, 1649101842, 1649101873, 1649101904, 1649101941, 1649101972, 1649102003, 1649102035, 1649102067, 1649102099, 1649102130, 1649102161, 1649102193, 1649102224, 1649102256, 1649102288, 1649102319, 1649102350, 1649102381, 1649102413, 1649102444, 1649102475, 1649102508, 1649102539, 1649102570, 1649102601, 1649102632, 1649102664, 1649102695, 1649102727, 1649102758, 1649102789, 1649102820, 1649102851, 1649102883, 1649102914, 1649102947, 1649102978, 1649103009, 1649103041, 1649103072, 1649103104, 1649103135, 1649103166, 1649103200, 1649103231, 1649103262, 1649103293, 1649103326, 1649103356, 1649103388, 1649103700, 1649103731, 1649103763, 1649103794, 1649103826, 1649103857, 1649103888, 1649103920, 1649103951, 1649103983, 1649104014, 1649104045, 1649104077, 1649104108, 1649104139, 1649104170, 1649104204, 1649104235, 1649104266, 1649104297, 1649104329, 1649104361, 1649104392, 1649104423, 1649104455, 1649104486, 1649104517, 1649104548, 1649104579, 1649104611, 1649104642, 1649104673, 1649104704, 1649104735, 1649104766, 1649104798, 1649104829, 1649104861, 1649104893, 1649104924, 1649104955, 1649104987, 1649105018, 1649105049, 1649105080, 1649105112, 1649105143, 1649105174, 1649105205, 1649105236, 1649105268, 1649105299, 1649105330, 1649105362, 1649105393, 1649105424, 1649105455, 1649105486, 1649105518, 1649105549, 1649105581, 1649105613, 1649105644, 1649105675, 1649105706, 1649105737, 1649105768, 1649105800, 1649105831, 1649105863, 1649105894, 1649105925, 1649105956, 1649105987, 1649106018, 1649106050, 1649106081, 1649106112, 1649106143, 1649106174, 1649106207, 1649106238, 1649106269, 1649106300, 1649106331, 1649106363, 1649106394, 1649106426, 1649106457, 1649106488, 1649106519, 1649106550, 1649106581, 1649106612, 1649106643, 1649106674, 1649106706, 1649106737, 1649106768, 1649106800, 1649106831, 1649106862, 1649106893, 1649106926, 1649106957, 1649106989, 1649107020, 1649107051, 1649107083, 1649107114, 1649107145, 1649107176, 1649107207, 1649107239, 1649107640, 1649107672, 1649107703, 1649107734, 1649107765, 1649107796, 1649107828, 1649107859, 1649107890, 1649107921, 1649107952, 1649107984, 1649108015, 1649108046, 1649108078, 1649108109, 1649108140, 1649108171, 1649108202, 1649108234, 1649108265, 1649108296, 1649108327, 1649108358, 1649108389, 1649108421, 1649108452, 1649108484, 1649108515, 1649108546, 1649108578, 1649108609, 1649108640, 1649108672, 1649108703, 1649108734, 1649108766, 1649108797, 1649108828, 1649108860, 1649108891, 1649108922, 1649108953, 1649108984, 1649109015, 1649109046, 1649109078, 1649109109, 1649109140, 1649109171, 1649109203, 1649109234, 1649109265, 1649109296, 1649109327, 1649109358, 1649109389, 1649109420, 1649109451, 1649109483, 1649109514, 1649109548, 1649109579, 
        //5
        1649109610, 1649109642, 1649109673, 1649109704, 1649109736, 1649109767, 1649109798, 1649109831, 1649109862, 1649109894, 1649109926, 1649109957, 1649109989, 1649110020, 1649110052, 1649110083, 1649110114, 1649110145, 1649110176, 1649110208, 1649110239, 1649110270, 1649110301, 1649110333, 1649110369, 1649110400, 1649110431, 1649110463, 1649110494, 1649110525, 1649110556, 1649110588, 1649110619, 1649110651, 1649110682, 1649110714, 1649110747, 1649110778, 1649110809, 1649110840, 1649110871, 1649110902, 1649110933, 1649110964, 1649110995, 1649111026, 1649111058, 1649111089, 1649111120, 1649111151, 1649111182, 1649111490, 1649111522, 1649111553, 1649111584, 1649111615, 1649111646, 1649111677, 1649111709, 1649111740, 1649111771, 1649111802, 1649111834, 1649111865, 1649111896, 1649111927, 1649111958, 1649111989, 1649112021, 1649112052, 1649112083, 1649112114, 1649112145, 1649112176, 1649112207, 1649112238, 1649112269, 1649112300, 1649112331, 1649112362, 1649112393, 1649112424, 1649112455, 1649112487, 1649112518, 1649112549, 1649112580, 1649112611, 1649112643, 1649112675, 1649112709, 1649112742, 1649112776, 1649112808, 1649112840, 1649112872, 1649112903, 1649112943, 1649112976, 1649113008, 1649113041, 1649113073, 1649113104, 1649113136, 1649113171, 1649113205, 1649113236, 1649113267, 1649113299, 1649113331, 1649113363, 1649113395, 1649113426, 1649113458, 1649113489, 1649113521, 1649113553, 1649113585, 1649113616, 1649113648, 1649113679, 1649113710, 1649113741, 1649113773, 1649113805, 1649113836, 1649113868, 1649113899, 1649113930, 1649113962, 1649113993, 1649114024, 1649114056, 1649114087, 1649114118, 1649114150, 1649114181, 1649114212, 1649114243, 1649114275, 1649114306, 1649114337, 1649114369, 1649114400, 1649114431, 1649114462, 1649114499, 1649114530, 1649114562, 1649114593, 1649114624, 1649114656, 1649114687, 1649114718, 1649114750, 1649114781, 1649114813, 1649114845, 1649114877, 1649114914, 1649114945, 1649114976, 1649115008, 1649115039, 1649115350, 1649115387, 1649115418, 1649115451, 1649115487, 1649115519, 1649115550, 1649115582, 1649115613, 1649115645, 1649115676, 1649115709, 1649115740, 1649115773, 1649115804, 1649115838, 1649115869, 1649115901, 1649115932, 1649115964, 1649115995, 1649116028, 1649116060, 1649116092, 1649116124, 1649116156, 1649116188, 1649116220, 1649116256, 1649116288, 1649116329, 1649116360, 1649116392, 1649116426, 1649116458, 1649116489, 1649116521, 1649116555, 1649116586, 1649116618, 1649116649, 1649116682, 1649116714, 1649116745, 1649116776, 1649116808, 1649116844, 1649116875, 1649116906, 1649116943, 1649116974, 1649117016, 1649117047, 1649117079, 1649117110, 1649117141, 1649117172, 1649117203, 1649117235, 1649117266, 1649117298, 1649117329, 1649117360, 1649117393, 1649117426, 1649117457, 1649117488, 1649117520, 1649117551, 1649117583, 1649117614, 1649117645, 1649117677, 1649117708, 1649117739, 1649117771, 1649117802, 1649117833, 1649117865, 1649117896, 1649117927, 1649117958, 1649117990, 1649118022, 1649118053, 1649118084, 1649118121, 1649118152, 1649118184, 1649118215, 1649118246, 1649118277, 1649118309, 1649118341, 1649118372, 1649118403, 1649118436, 1649118467, 1649118499, 1649118535, 1649118566, 1649118598, 1649118629, 1649118661, 1649118692, 1649118723, 1649118755, 1649118791, 1649118822, 1649118853, 1649118896, 1649119150, 1649119181, 1649119212, 1649119244, 1649119275, 1649119306, 1649119338, 1649119369, 1649119400, 1649119432, 1649119463, 1649119494, 1649119535, 1649119568, 1649119599, 1649119630, 1649119666, 1649119698, 1649119729, 1649119760, 1649119791, 1649119822, 1649119853, 1649119885, 1649119916, 1649119947, 1649119978, };


    int color_dist_hue(wxColour col1, wxColour col2) {

        uint32_t int_color = col1.GetRGB();
        AppConfig::rgb rgb_color = AppConfig::int2rgb(int_color);
        AppConfig::hsv hsv_color1 = AppConfig::rgb2hsv(rgb_color);

        int_color = col2.GetRGB();
        rgb_color = AppConfig::int2rgb(int_color);
        AppConfig::hsv hsv_color2 = AppConfig::rgb2hsv(rgb_color);

        int dist = 0;
        if (hsv_color1.h > hsv_color2.h)
            dist = std::min(hsv_color1.h - hsv_color2.h, hsv_color2.h - hsv_color1.h + 360);
        else
            dist = std::min(hsv_color2.h - hsv_color1.h, hsv_color1.h - hsv_color2.h + 360);
        dist += std::abs(hsv_color1.s - hsv_color2.s) * 100;
        dist += std::abs(hsv_color1.v - hsv_color2.v) * 100;

        return dist;
    }

    int color_dist_std(wxColour col1, wxColour col2) {
        int dist = std::abs(col1.Red() - col2.Red());
        dist += std::abs(col1.Green() - col2.Green());
        dist += std::abs(col1.Blue() - col2.Blue());
        return dist;
    }

    int color_dist_not_blue(wxColour col1, wxColour col2) {
        int dist = std::abs(col1.Red() - col2.Red());
        dist += std::abs(col1.Green() - col2.Green());
        //blue is less perceptible by humans
        dist += std::abs(col1.Blue() - col2.Blue())/ 2;
        return dist;
    }

    int color_dist(int method, wxColour col1, wxColour col2) {
        if (method == 1)
            return color_dist_not_blue(col1, col2);
        if (method == 2)
            return color_dist_hue(col1, col2);
        return color_dist_std(col1,col2);
    }

    BEGIN_EVENT_TABLE(BasicDrawPane, wxPanel)
        // some useful events
        /*
         EVT_MOTION(BasicDrawPane::mouseMoved)
         EVT_LEFT_DOWN(BasicDrawPane::mouseDown)
         EVT_LEFT_UP(BasicDrawPane::mouseReleased)
         EVT_RIGHT_DOWN(BasicDrawPane::rightClick)
         EVT_LEAVE_WINDOW(BasicDrawPane::mouseLeftWindow)
         EVT_KEY_DOWN(BasicDrawPane::keyPressed)
         EVT_KEY_UP(BasicDrawPane::keyReleased)
         EVT_MOUSEWHEEL(BasicDrawPane::mouseWheelMoved)
         */

         // catch paint events
        EVT_PAINT(BasicDrawPane::paintEvent)

        END_EVENT_TABLE()


        // some useful events
        /*
         void BasicDrawPane::mouseMoved(wxMouseEvent& event) {}
         void BasicDrawPane::mouseDown(wxMouseEvent& event) {}
         void BasicDrawPane::mouseWheelMoved(wxMouseEvent& event) {}
         void BasicDrawPane::mouseReleased(wxMouseEvent& event) {}
         void BasicDrawPane::rightClick(wxMouseEvent& event) {}
         void BasicDrawPane::mouseLeftWindow(wxMouseEvent& event) {}
         void BasicDrawPane::keyPressed(wxKeyEvent& event) {}
         void BasicDrawPane::keyReleased(wxKeyEvent& event) {}
         */

        BasicDrawPane::BasicDrawPane(wxWindow* parent, MyDynamicConfig* config) :
        wxPanel(parent)
    {
        SetMinSize(wxSize(404, 404));
    }

    /*
     * Called by the system of by wxWidgets when the panel needs
     * to be redrawn. You can also trigger this call by
     * calling Refresh()/Update().
     */

    void BasicDrawPane::paintEvent(wxPaintEvent& evt)
    {
        wxPaintDC dc(this);
        render(dc);
    }

    /*
     * Alternatively, you can use a clientDC to paint on the panel
     * at any time. Using this generally does not free you from
     * catching paint events, since it is possible that e.g. the window
     * manager throws away your drawing when the window comes to the
     * background, and expects you will redraw it when the window comes
     * back (by sending a paint event).
     *
     * In most cases, this will not be needed at all; simply handling
     * paint events and calling Refresh() when a refresh is needed
     * will do the job.
     */
    void BasicDrawPane::paintNow()
    {
        wxClientDC dc(this);
        render(dc);
    }

    void BasicDrawPane::redrawImage()
    {
    }

    /*
     * Here we do the actual rendering. I put it in a separate
     * method so that it can work no matter what type of DC
     * (e.g. wxPaintDC or wxClientDC) is used.
     */
    void BasicDrawPane::render(wxDC& dc)
    {
        dc.SetBrush(*wxBLACK_BRUSH);
        dc.DrawRectangle(0, 0, GetSize().x, GetSize().y);

        if (!bmp.IsOk())
            return;
        if (bmp.GetSize().x <= 0 || bmp.GetSize().y <= 0)
            return;
        if (bmp.GetWidth() == 0 || bmp.GetHeight() == 0)
            return;

        if (previous_size != GetSize()) {
            previous_size = GetSize();
            Refresh();
            return;
        }

        Vec2d offset_dbl = parent->m_config.option<ConfigOptionPoint>("offset")->value;
        wxSize offset(std::min(int(offset_dbl.x()), std::max(0, bmp.GetSize().x - 1)), std::min(int(offset_dbl.y()), std::max(0, bmp.GetSize().y - 1)));
        Vec2d size_dbl = parent->m_config.option<ConfigOptionPoint>("size")->value;
        wxSize size(std::min(int(size_dbl.x()), bmp.GetSize().x - offset.x), std::min(int(size_dbl.y()), bmp.GetSize().y - offset.y));
        Vec2d pixel_size = parent->m_config.option<ConfigOptionPoint>("size_px")->value;
        double separation = parent->m_config.opt_float("separation_xy");

        //compute pixel per mm
        double max_x_mm = (size.x * (pixel_size.x() + separation) - separation);
        double max_y_mm = (size.y * (pixel_size.y() + separation) - separation);
        float mm_per_pixel = std::max(max_x_mm / (GetSize().x - 4), max_y_mm / (GetSize().y - 4));

        //compute pixel per tile & per separation
        int pixels_separation = int(separation / mm_per_pixel) + (separation - int(separation / mm_per_pixel) > mm_per_pixel / 2 ? 1 : 0);
        float ratiox = std::max(1.f, float(pixel_size.x() / pixel_size.y()));
        float ratioy = std::max(1.f, float(pixel_size.y() / pixel_size.x()));
        int pixels_reste_x = (GetSize().x - 4 - pixels_separation * (size.x - 1));
        int pixels_reste_y = (GetSize().y - 4 - pixels_separation * (size.y - 1));
        double pixels_per_tile_dbl_x = (pixels_reste_x / double(size.x * ratiox)); // (pixel_size.x() / pixel_size.y())));
        double pixels_per_tile_dbl_y = (pixels_reste_y / double(size.y * ratioy)); // (pixel_size.y() / pixel_size.x())));
        double pixels_per_tile = std::min(pixels_per_tile_dbl_x, pixels_per_tile_dbl_y);
        int pixels_per_tile_x = std::max(1, int(pixels_per_tile * ratiox));
        int pixels_per_tile_y = std::max(1, int(pixels_per_tile * ratioy));

        bool show_original = parent->m_config.option<ConfigOptionBool>("original")->value;
        const int color_algo = parent->m_config.option<ConfigOptionInt>("color_comp")->value;
        bool use_near_color = parent->m_config.option<ConfigOptionBool>("near_color")->value;
        bool use_spool_colors = parent->m_config.option<ConfigOptionBool>("spool_colors")->value;
        wxColour background_color{ wxString{ parent->m_config.option<ConfigOptionString>("background_color")->value } };

        parent->recompute_colors();

        std::unordered_map<int, wxBrush*> col2nearest;
        for (ColorEntry& c : parent->m_pixel_colors) {
            if (c.nb_pixels_real <= 0) continue;
            wxColour color = c.real_color;
            if (show_original) {
                col2nearest[c.real_color.GetRGB()] = wxTheBrushList->FindOrCreateBrush(c.real_color);
            } else {
                int idx_extruder = 0;
                //first check if there is an overide
                if (use_spool_colors && c.widget_spool && !c.widget_spool->is_auto()) {
                    color = c.widget_spool->get_print_color()->get_printed_color(use_spool_colors);
                }
                //get nearest
                for (int i = 0; i < parent->m_used_colors.size(); i++) {
                    if (parent->m_used_colors[i]->get_printed_color(use_spool_colors) == color) {
                        idx_extruder = i;
                        break;
                    } else if (use_near_color && (color_dist(color_algo, parent->m_used_colors[i]->get_printed_color(use_spool_colors), color) < color_dist(color_algo, parent->m_used_colors[idx_extruder]->get_printed_color(use_spool_colors), color))) {
                        idx_extruder = i;
                    }
                }
                color = parent->m_used_colors[idx_extruder]->get_printed_color(use_spool_colors);
                col2nearest[c.real_color.GetRGB()] = wxTheBrushList->FindOrCreateBrush(color);
            }
        }

        dc.SetBrush(*wxBLACK_BRUSH);
        dc.SetBrush(*col2nearest[background_color.GetRGB()]); //beckground color is in the m_pixel_colors list
        dc.DrawRectangle(
            2,
            2,
            size.x * (pixels_separation + pixels_per_tile_x) - pixels_separation,
            size.y * (pixels_separation + pixels_per_tile_y) - pixels_separation);
        
        wxNativePixelData data(bmp);
        wxNativePixelData::Iterator p(bmp, data);
        if (offset.y > 0)
            p.OffsetY(data, offset.y);
        for (int y = 0; y < size.y; ++y) {
            wxNativePixelData::Iterator rowStart = p;
            if (offset.x > 0)
                p.OffsetX(data, offset.x);
            for (int x = 0; x < size.x; x++, ++p) {
                wxColour color(p.Red(), p.Green(), p.Blue());
                dc.SetBrush(*col2nearest[color.GetRGB()]);
                dc.DrawRectangle(
                    2 + x * (pixels_separation + pixels_per_tile_x),
                    2 + y * (pixels_separation + pixels_per_tile_y),
                    pixels_per_tile_x,
                    pixels_per_tile_y);
            }
            p = rowStart;
            p.OffsetY(data, 1);
        }
    }

    void BasicDrawPane::loadImage(std::string path) {
        //wxImage image;
        //if (!image.LoadFile(Slic3r::GUI::from_u8(Slic3r::var("C:/Users/VR-REMI/Downloads/1649109736.png")), wxBITMAP_TYPE_PNG) ||
        //    image.GetWidth() == 0 || image.GetHeight() == 0)
        //    return ;
        if (boost::filesystem::exists(path))
            this->bmp = wxBitmap(path, wxBITMAP_TYPE_PNG);
        else
            this->bmp = wxBitmap();
    }

    class GetRPlaceDialog : public DPIDialog
    {
    public:
        wxSpinCtrl* day;
        wxSpinCtrl* hour;
        wxSpinCtrl* minute;
        wxSpinCtrl* second;

        wxButton* bt_previous;
        wxButton* bt_next;

        long timestamp = 0;

        static inline long last_timestamp = 1649112424;

        void check_file(int delta = 0) {
            const long timestamp_2022_04_01 = 1648764000;
            timestamp = timestamp_2022_04_01 + 86400 * (day->GetValue() - 1);
            timestamp += 3600 * (hour->GetValue());
            timestamp += 60 * (minute->GetValue());
            timestamp += (second->GetValue());
            timestamp += delta;
            //it's ordered
            int idx = 0;
            while (idx < rplace_timestamp.size() && timestamp > rplace_timestamp[idx]) { idx++; }
            //if after the last or ( if not found, and it not before the begin, and only if we don't want the next.)
            if (idx >= rplace_timestamp.size() || (timestamp != rplace_timestamp[idx] && idx > 0 && delta<=0)) idx--;
            //enforce a good file
            timestamp = rplace_timestamp[idx];
            day->SetValue(1 + (timestamp - 1648764000) / 86400);
            hour->SetValue(((timestamp - 1648764000) / 3600) % 24);
            minute->SetValue(((timestamp - 1648764000) / 60) % 60);
            second->SetValue((timestamp - 1648764000) % 60);
        }


        GetRPlaceDialog(wxWindow* p, wxWindowID id, const wxString& title) : DPIDialog(p, id, title, wxDefaultPosition, wxDefaultSize){
            int spin_options = wxTE_PROCESS_ENTER | wxSP_ARROW_KEYS
#ifdef _WIN32
                | wxBORDER_SIMPLE
#endif
                ;
            // last pic before white 1649112424 ~05/04/2022 00:47:04 
            wxStaticText* lbl_day = new wxStaticText(this, wxID_ANY, "Day");
            wxStaticText* lbl_hour = new wxStaticText(this, wxID_ANY, "Hour");
            wxStaticText* lbl_minute = new wxStaticText(this, wxID_ANY, "Minute");
            wxStaticText* lbl_second = new wxStaticText(this, wxID_ANY, "Second");
            day = new wxSpinCtrl(this, wxID_ANY, "Day", wxDefaultPosition, wxSize(80,20), spin_options, 1, 6, 5);
            hour = new wxSpinCtrl(this, wxID_ANY, "H", wxDefaultPosition, wxSize(80, 20), spin_options, 0, 24, 0);
            minute = new wxSpinCtrl(this, wxID_ANY, "M", wxDefaultPosition, wxSize(80, 20), spin_options, 0, 60, 47);
            second = new wxSpinCtrl(this, wxID_ANY, "S", wxDefaultPosition, wxSize(80, 20), spin_options, 0, 60, 35);
            timestamp = last_timestamp;
            day->SetValue(1 + (timestamp - 1648764000) / 86400);
            hour->SetValue(((timestamp - 1648764000) / 3600) % 24);
            minute->SetValue(((timestamp - 1648764000) / 60) % 60);
            second->SetValue((timestamp - 1648764000) % 60);
            day->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) {  check_file();  }), day->GetId());
            hour->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) {  check_file();  }), hour->GetId());
            minute->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) {  check_file();  }), minute->GetId());
            second->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) {  check_file();  }), second->GetId());
            bt_previous = new wxButton(this, wxID_ANY, _L("Previous"));
            bt_previous->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) {  check_file(-1);  }), bt_previous->GetId());
            bt_next = new wxButton(this, wxID_ANY, _L("Next"));
            bt_next->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) {  check_file(1);  }), bt_next->GetId());
            wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxCANCEL | wxOK);
            std::sort(rplace_timestamp.begin(), rplace_timestamp.end());

            wxGridBagSizer* gb_sizer = new wxGridBagSizer(1, 1); //(int vgap, int hgap)
            int x=1, y=1;
            x = 2;
            gb_sizer->Add(lbl_day, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(lbl_hour, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(lbl_minute, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(lbl_second, wxGBPosition(y, x++), wxGBSpan(1, 1));
            x = 1; y++;
            gb_sizer->Add(bt_previous, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(day, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(hour, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(minute, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(second, wxGBPosition(y, x++), wxGBSpan(1, 1));
            gb_sizer->Add(bt_next, wxGBPosition(y, x++), wxGBSpan(1, 1));
            x = 1; y++;
            gb_sizer->Add(buttons, wxGBPosition(y, x), wxGBSpan(1, 6));
            
            SetSizerAndFit(gb_sizer);
            //this->Fit();
            //wxSize dialog_size((80*6+20) * this->scale_factor(), 150 * this->scale_factor());
            //this->SetSize(dialog_size);
            //this->Fit();

            check_file();
        }
        virtual ~GetRPlaceDialog() {}

        void on_dpi_changed(const wxRect& suggested_rect) override
        {
            msw_buttons_rescale(this, em_unit(), { wxID_APPLY, wxID_CLOSE });

            wxSize oldSize = this->GetSize();
            Layout();
            this->SetSize(oldSize.x * this->scale_factor() / this->prev_scale_factor(), oldSize.y * this->scale_factor() / this->prev_scale_factor());
            Refresh();
        }

    };

void CreateMMUTiledCanvas::recompute_colors()
{

    wxBitmap& bmp = get_canvas()->bmp;
    if (!bmp.IsOk())
        return;
    if (bmp.GetSize().x <= 0 || bmp.GetSize().y <= 0)
        return;
    if (bmp.GetWidth() == 0 || bmp.GetHeight() == 0)
        return;

    Vec2d offset_dbl = m_config.option<ConfigOptionPoint>("offset")->value;
    wxSize offset(std::min(int(offset_dbl.x()), std::max(0, bmp.GetSize().x - 1)), std::min(int(offset_dbl.y()), std::max(0, bmp.GetSize().y - 1)));
    Vec2d size_dbl = m_config.option<ConfigOptionPoint>("size")->value;
    wxSize size(std::min(int(size_dbl.x()), bmp.GetSize().x - offset.x), std::min(int(size_dbl.y()), bmp.GetSize().y - offset.y));
    Vec2d pixel_size = m_config.option<ConfigOptionPoint>("size_px")->value;
    double separation = m_config.opt_float("separation_xy");

    //compute pixel per mm
    double max_x_mm = (size.x * (pixel_size.x() + separation) - separation);
    double max_y_mm = (size.y * (pixel_size.y() + separation) - separation);
    float mm_per_pixel = std::max(max_x_mm / (GetSize().x - 4), max_y_mm / (GetSize().y - 4));

    //compute pixel per tile & per separation
    int pixels_separation = int(separation / mm_per_pixel) + (separation - int(separation / mm_per_pixel) > mm_per_pixel / 2 ? 1 : 0);
    int ratiox = std::min(1, int(pixel_size.x() / pixel_size.y()));
    int ratioy = std::min(1, int(pixel_size.y() / pixel_size.x()));
    int pixels_reste_x = (GetSize().x - 4 - pixels_separation * (size.x - 1));
    int pixels_reste_y = (GetSize().y - 4 - pixels_separation * (size.y - 1));
    double pixels_per_tile_dbl_x = (pixels_reste_x / double(size.x * (pixel_size.x() / pixel_size.y())));
    double pixels_per_tile_dbl_y = (pixels_reste_y / double(size.y * (pixel_size.y() / pixel_size.x())));
    double pixels_per_tile = std::min(pixels_per_tile_dbl_x, pixels_per_tile_dbl_y);
    int pixels_per_tile_x = std::max(1, int(pixels_per_tile * ratiox));
    int pixels_per_tile_y = std::max(1, int(pixels_per_tile * ratioy));

    bool show_original = m_config.option<ConfigOptionBool>("original")->value;
    wxColour background_color{ wxString{ m_config.option<ConfigOptionString>("background_color")->value } };

    for (ColorEntry& col : m_pixel_colors) {
        col.reset();
        col.printing_color = nullptr;
    }
    //create background color
    {
        int idx = -1;
        for (int i = 0; i < m_pixel_colors.size(); i++) {
            if (m_pixel_colors[i].real_color == background_color) {
                idx = i;
                break;
            }
        }
        if (idx < 0) {
            idx = m_pixel_colors.size();
            m_pixel_colors.emplace_back(background_color);
        }
        //as background, it's the most used extruder;
        m_pixel_colors[idx].nb_pixels_real = 100000;
    }
    // create colors & count pixels
    {
        wxNativePixelData data(bmp);
        wxNativePixelData::Iterator p(bmp, data);
        if (offset.y > 0)
            p.OffsetY(data, offset.y);
        for (int y = 0; y < size.y; ++y) {
            wxNativePixelData::Iterator rowStart = p;
            if (offset.x > 0)
                p.OffsetX(data, offset.x);
            for (int x = 0; x < size.x; x++, ++p) {
                wxColour color(p.Red(), p.Green(), p.Blue());
                int idx = -1;
                for (int i = 0; i < m_pixel_colors.size(); i++) {
                    if (m_pixel_colors[i].real_color == color) {
                        idx = i;
                        break;
                    }
                }
                if (idx < 0) {
                    idx = m_pixel_colors.size();
                    m_pixel_colors.emplace_back(color);
                }
                m_pixel_colors[idx].add_pixel();
            }
            p = rowStart;
            p.OffsetY(data, 1);
        }
    }

    // collect colors to merge
    bool use_spool = m_config.opt_bool("spool_colors");
    std::vector<ColorEntry*> old_colors = m_used_colors;
    m_used_colors.clear();
    for (ColorEntry& col : m_pixel_colors) {
        if (col.nb_pixels_real > 0) {
            m_used_colors.push_back(&col);
        }
    }

    const int color_algo = m_config.option<ConfigOptionInt>("color_comp")->value;
    bool use_near_color = m_config.option<ConfigOptionBool>("near_color")->value;
    int nb_extruders = dynamic_cast<TabPrinter*>(m_gui_app->get_tab(Preset::TYPE_PRINTER))->m_extruders_count;
    // re-order and fusion
    if (use_spool) {
        //use only spools first
        for (ColorEntry& spool : m_spools)
            spool.reset();
        for (ColorEntry* c : m_used_colors) {
            if (c->widget_spool && !c->widget_spool->is_auto()) {
                c->printing_color = c->widget_spool->get_print_color();
                c->printing_color->nb_pixels_real += c->nb_pixels_sum;
            } else {
                c->printing_color = &m_spools[0];
                for (int i = 1; i < m_spools.size(); i++) {
                    if ((color_dist(color_algo, m_spools[i].get_printed_color(use_spool), c->real_color) < color_dist(color_algo, c->printing_color->get_printed_color(use_spool), c->real_color))) {
                        c->printing_color = &m_spools[i];
                    }
                }
                c->printing_color->nb_pixels_real += c->nb_pixels_sum;
            }
        }

        //then, if too much spools, merge them.
        m_used_colors.clear();
        for (ColorEntry& col : m_spools) {
            if (col.nb_pixels_real > 0) {
                col.nb_pixels_sum = col.nb_pixels_real;
                m_used_colors.push_back(&col);
            }
        }
    }

    // merge until nb_extruder is enough
    std::sort(m_used_colors.begin(), m_used_colors.end(), [](ColorEntry* e1, ColorEntry* e2) { return e1->nb_pixels_sum > e2->nb_pixels_sum; });
    while (use_near_color && m_used_colors.size() > nb_extruders) {
        //move the smallest color into the nearest one
        int idx_extruder = 0;
        for (int i = 1; i < m_used_colors.size() - 1; i++) {
            if ((color_dist(color_algo, m_used_colors[i]->real_color, m_used_colors.back()->real_color) < color_dist(color_algo, m_used_colors[idx_extruder]->real_color, m_used_colors.back()->real_color))) {
                idx_extruder = i;
            }
        }
        m_used_colors[idx_extruder]->nb_pixels_sum += m_used_colors.back()->nb_pixels_sum;
        m_used_colors.back()->reset_merge();
        m_used_colors.back()->printing_color = m_used_colors[idx_extruder];
        m_used_colors.erase(m_used_colors.end() - 1);
        std::sort(m_used_colors.begin(), m_used_colors.end(), [](ColorEntry* e1, ColorEntry* e2) { return e1->nb_pixels_sum > e2->nb_pixels_sum; });
    }

    if (old_colors != m_used_colors) {
        refresh_description();
        recreate_color_conversion();
    }
}

CreateMMUTiledCanvas::~CreateMMUTiledCanvas() {

}

void CreateMMUTiledCanvas::save_config()
{
    std::string config_str;
    for (const std::string& key : m_config.keys())
        if (!m_config.option(key)->is_nil())
            config_str += key + " = " + m_config.opt_serialize(key) + "\n";

    boost::filesystem::path path_dir = Slic3r::data_dir();
    path_dir = path_dir / "generator";
    if (!boost::filesystem::exists(path_dir))
        boost::filesystem::create_directories(path_dir);
    boost::filesystem::path path_ini = path_dir / "config.ini";
    boost::filesystem::path path_temp = path_dir / "config.ini.temp";

    boost::nowide::ofstream c;
    c.open(path_temp.string(), std::ios::out | std::ios::trunc);
    c << config_str;
#ifdef WIN32
    // WIN32 specific: The final "rename_file()" call is not safe in case of an application crash, there is no atomic "rename file" API
    // provided by Windows (sic!). Therefore we save a MD5 checksum to be able to verify file corruption. In addition,
    // we save the config file into a backup first before moving it to the final destination.
    c << AppConfig::appconfig_md5_hash_line(config_str);
#endif
    c.close();
#ifdef WIN32
    // Make a backup of the configuration file before copying it to the final destination.
    std::string error_message;
    boost::filesystem::path path_bak = path_dir / "config.ini.bak";
    // Copy configuration file with PID suffix into the configuration file with "bak" suffix.
    if (copy_file(path_temp.string(), path_bak.string(), error_message, false) != SUCCESS)
        BOOST_LOG_TRIVIAL(error) << "Copying from " << path_temp.string() << " to " << path_bak.string() << " failed. Failed to create a backup configuration.";
#endif
    // Rename the config atomically.
    // On Windows, the rename is likely NOT atomic, thus it may fail if PrusaSlicer crashes on another thread in the meanwhile.
    // To cope with that, we already made a backup of the config on Windows.
    rename_file(path_temp.string(), path_ini.string());
    m_dirty = false;
}

void CreateMMUTiledCanvas::load_config()
{
    if (m_config.config_def.options.empty()) {
        //create defs
        ConfigOptionDef def;

        def = ConfigOptionDef();
        def.label = L("Pixels count");
        def.type = coPoint;
        def.tooltip = L("Number of pixels in x and y axis to include in the tile.");
        def.sidetext = L("px");
        def.min = 0;
        def.set_default_value(new ConfigOptionPoint{ Vec2d{ 32,32 } });
        m_config.config_def.options["size"] = def;
        m_config.set_key_value("size", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Pixel Size");
        def.type = coPoint;
        def.tooltip = L("Size in mm on x and y axis for a pixel");
        def.sidetext = L("mm");
        def.min = 0;
        def.set_default_value(new ConfigOptionPoint{ Vec2d{ 5,5 } });
        m_config.config_def.options["size_px"] = def;
        m_config.set_key_value("size_px", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("height");
        def.type = coFloat;
        def.tooltip = L("Height of the full object.");
        def.set_default_value(new ConfigOptionFloat{ 1 });
        def.sidetext = L("mm");
        def.min = 0;
        def.width = 4;
        m_config.config_def.options["height"] = def;
        m_config.set_key_value("height", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Offset");
        def.type = coPoint;
        def.tooltip = L("First pixel position (top left corner) in the image.");
        def.sidetext = L("mm");
        def.min = 0;
        def.set_default_value(new ConfigOptionPoint{ Vec2d{ 140,330 } });
        m_config.config_def.options["offset"] = def;
        m_config.set_key_value("offset", def.default_value.get()->clone());


        def = ConfigOptionDef();
        def.label = L("XY");
        def.type = coFloat;
        def.tooltip = L("Number of mm between (pixel) tiles.");
        //def.sidetext = L("mm");
        def.min = 0;
        def.width = 4;
        def.set_default_value(new ConfigOptionFloat{ 1 });
        m_config.config_def.options["separation_xy"] = def;
        m_config.set_key_value("separation_xy", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Z");
        def.type = coFloat;
        def.tooltip = L("Height of the separation. If higher than the height, then tiles won't be joined."
            "\nA zero value isn't supported yet. Please use at least one layer of separation.");
        def.sidetext = L("mm");
        def.min = 0.01;
        def.width = 4;
        def.set_default_value(new ConfigOptionFloat{ 0.6 });
        m_config.config_def.options["separation_z"] = def;
        m_config.set_key_value("separation_z", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Bezel");
        def.type = coFloat;
        def.tooltip = L("Bevel for the bottom of the 'pillars'. Should be less than half of Pixel Size");
        def.sidetext = L("mm");
        def.min = 0.0;
        def.width = 4;
        def.set_default_value(new ConfigOptionFloat{ 0.0 });
        m_config.config_def.options["bezel"] = def;
        m_config.set_key_value("bezel", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Border");
        def.type = coFloat;
        def.tooltip = L("Border width over the mosaic plate.");
        def.sidetext = L("mm");
        def.min = 0.0;
        def.width = 4;
        def.set_default_value(new ConfigOptionFloat{ 0.0 });
        m_config.config_def.options["border"] = def;
        m_config.set_key_value("border", def.default_value.get()->clone());
        

        //not implemented yet
        //def = ConfigOptionDef();
        //def.label = L("Z Bump");
        //def.type = coFloat;
        //def.tooltip = L("If you want to have a 3D shaped tile, set this setting. It's the height diff at the center of the tile.");
        //def.sidetext = L("mm");
        //def.set_default_value(new ConfigOptionFloat{ 0 });
        //m_config.config_def.options["bump"] = def;
        //m_config.set_key_value("bump", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Use nearest color");
        def.type = coBool;
        def.tooltip = L("If there is not enough extruders configured, use the one with the nearest color. It will use the nearest spool color if spool_colors is set.");
        def.set_default_value(new ConfigOptionBool{ true });
        m_config.config_def.options["near_color"] = def;
        m_config.set_key_value("near_color", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("From dark to light");
        def.type = coBool;
        def.tooltip = L("If checked, it will order the extruder from the darker to the lighter, and the opposite if unchecked. Useful to optimise the purge volume needed when switching colors.");
        def.set_default_value(new ConfigOptionBool{ false });
        m_config.config_def.options["order_dark"] = def;
        m_config.set_key_value("order_dark", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Use real spool colors");
        def.type = coBool;
        def.tooltip = L("Uses colors from your spools, defined in the second tab.");
        def.set_default_value(new ConfigOptionBool{ false });
        m_config.config_def.options["spool_colors"] = def;
        m_config.set_key_value("spool_colors", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Comparator");
        def.type = coInt;
        def.tooltip = L("Choose how to compare color, to choose what's merged");
        def.gui_type = ConfigOptionDef::GUIType::i_enum_open;
        def.enum_values.push_back("0");
        def.enum_values.push_back("1");
        def.enum_values.push_back("2");
        def.enum_labels.push_back("RGB");
        def.enum_labels.push_back("RGb");
        def.enum_labels.push_back("Hsv");
        def.set_default_value(new ConfigOptionInt{ 0 });
        m_config.config_def.options["color_comp"] = def;
        m_config.set_key_value("color_comp", def.default_value.get()->clone());


        def = ConfigOptionDef();
        def.label = L("Show original colors");
        def.type = coBool;
        def.tooltip = L("The preview shows what's going to be generated. Select this option to see the original file instead.");
        def.set_default_value(new ConfigOptionBool{ false });
        m_config.config_def.options["original"] = def;
        m_config.set_key_value("original", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Extruders");
        def.type = coInt;
        def.min = 1;
        def.tooltip = L("Shortcut to change the number of extruders quickly. It's not refreshed when the real setting changes, so be careful to don't be confused.");
        def.set_default_value(new ConfigOptionInt((int)dynamic_cast<TabPrinter*>(this->m_gui_app->get_tab(Preset::TYPE_PRINTER))->m_extruders_count));
        m_config.config_def.options["extruders"] = def;
        m_config.set_key_value("extruders", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Available colors");
        def.type = coStrings;
        def.tooltip = L("Colors available for printing (your spools colors)");
        def.gui_type = ConfigOptionDef::GUIType::color;
        def.set_default_value(new ConfigOptionStrings{ "#0000FF" });
        m_config.config_def.options["available_colors"] = def;
        m_config.set_key_value("available_colors", def.default_value.get()->clone());

        def = ConfigOptionDef();
        def.label = L("Background color");
        def.type = coString;
        def.tooltip = L("Color for pillars and base layers.");
        def.gui_type = ConfigOptionDef::GUIType::color;
        def.set_default_value(new ConfigOptionString( "#FFFFFF" ));
        m_config.config_def.options["background_color"] = def;
        m_config.set_key_value("background_color", def.default_value.get()->clone());
    }

    boost::filesystem::path path_dir = Slic3r::data_dir();
    path_dir = path_dir / "generator";
    if (!boost::filesystem::exists(path_dir))
        return;
    std::string path = (path_dir / "config.ini").string();

    // 1) Read the complete config file into a boost::property_tree.
    namespace pt = boost::property_tree;
    pt::ptree tree;
    boost::nowide::ifstream ifs;
    bool                    recovered = false;

    try {
        ifs.open(path);
#ifdef WIN32
        // Verify the checksum of the config file without taking just for debugging purpose.
        const AppConfig::ConfigFileInfo config_file_info = AppConfig::check_config_file_and_verify_checksum(ifs);
        if (!config_file_info.correct_checksum) {
            BOOST_LOG_TRIVIAL(info) << "The configuration file " << path <<
                " has a wrong MD5 checksum or the checksum is missing. This may indicate a file corruption or a harmless user edit.";
        }
        if (!config_file_info.correct_checksum && config_file_info.contains_null) {
            BOOST_LOG_TRIVIAL(info) << "The configuration file " + path + " is corrupted, because it is contains null characters.";
            throw Slic3r::CriticalException("The configuration file contains null characters.");
        }
        ifs.seekg(0, boost::nowide::ifstream::beg);
#endif
        try {
            pt::read_ini(ifs, tree);
        }
        catch (pt::ptree_error& ex) {
            throw Slic3r::CriticalException(ex.what());
        }
    }
    catch (Slic3r::CriticalException& ex) {
#ifdef WIN32
        // The configuration file is corrupted, try replacing it with the backup configuration.
        ifs.close();
        std::string backup_path = (boost::format("%1%.bak") % path).str();
        if (boost::filesystem::exists(backup_path)) {
            // Compute checksum of the configuration backup file and try to load configuration from it when the checksum is correct.
            boost::nowide::ifstream backup_ifs(backup_path);
            if (const AppConfig::ConfigFileInfo config_file_info = AppConfig::check_config_file_and_verify_checksum(backup_ifs); !config_file_info.correct_checksum || config_file_info.contains_null) {
                BOOST_LOG_TRIVIAL(error) << format(R"(Both "%1%" and "%2%" are corrupted. It isn't possible to restore configuration from the backup.)", path, backup_path);
                backup_ifs.close();
                boost::filesystem::remove(backup_path);
            } else if (std::string error_message; copy_file(backup_path, path, error_message, false) != SUCCESS) {
                BOOST_LOG_TRIVIAL(error) << format(R"(Configuration file "%1%" is corrupted. Failed to restore from backup "%2%": %3%)", path, backup_path, error_message);
                backup_ifs.close();
                boost::filesystem::remove(backup_path);
            } else {
                BOOST_LOG_TRIVIAL(info) << format(R"(Configuration file "%1%" was corrupted. It has been successfully restored from the backup "%2%".)", path, backup_path);
                // Try parse configuration file after restore from backup.
                try {
                    ifs.open(path);
                    pt::read_ini(ifs, tree);
                    recovered = true;
                }
                catch (pt::ptree_error& ex) {
                    BOOST_LOG_TRIVIAL(info) << format(R"(Failed to parse configuration file "%1%" after it has been restored from backup: %2%)", path, ex.what());
                }
            }
        } else
#endif // WIN32
            BOOST_LOG_TRIVIAL(info) << format(R"(Failed to parse configuration file "%1%": %2%)", path, ex.what());
        if (!recovered) {
            // Report the initial error of parsing PrusaSlicer.ini.
            // Error while parsing config file. We'll customize the error message and rethrow to be displayed.
            // ! But to avoid the use of _utf8 (related to use of wxWidgets) 
            // we will rethrow this exception from the place of load() call, if returned value wouldn't be empty
            /*
            throw Slic3r::RuntimeError(
                _utf8(L("Error parsing " SLIC3R_APP_NAME " config file, it is probably corrupted. "
                        "Try to manually delete the file to recover from the error. Your user profiles will not be affected.")) +
                "\n\n" + AppConfig::config_path() + "\n\n" + ex.what());
            */
            //TODO: emit error message
        }
    }

    ConfigSubstitutionContext context(ForwardCompatibilitySubstitutionRule::Disable);
    // 2) Parse the property_tree, extract the sections and key / value pairs.
    for (const auto& section : tree) {
        if (section.second.empty()) {
            // This may be a top level (no section) entry, or an empty section.
            std::string data = section.second.data();
            if (!data.empty())
                m_config.set_deserialize_nothrow(section.first, data, context);
        }
    }
}

CreateMMUTiledCanvas::CreateMMUTiledCanvas(GUI_App* app, MainFrame* mainframe)
    : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _L("Creating Mosaic tiled canvas"),
//#if ENABLE_SCROLLABLE
        wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
//#else
//    wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
//#endif // ENABLE_SCROLLABLE
{

    this->m_gui_app = app;
    this->m_main_frame = mainframe;
    SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
    //SetPosition(wxSize(0, 0));

    load_config();

#ifdef _MSW_DARK_MODE
    wxBookCtrlBase* tabs;
    //	if (wxGetApp().dark_mode())
    tabs = new Notebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME | wxNB_DEFAULT);
    /*	else {
            tabs = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME | wxNB_DEFAULT);
            tabs->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
        }*/
#else
    wxNotebook* tabs = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME | wxNB_DEFAULT);
    tabs->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
#endif

    // fonts
    const wxFont& font = wxGetApp().normal_font();
    //const wxFont& bold_font = wxGetApp().bold_font();
    SetFont(font);

    wxPanel* tab_main = new wxPanel(tabs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL);
    tabs->AddPage(tab_main, "Preview & settings");
    tab_main->SetFont(font);
    create_main_tab(tab_main);

    wxPanel* tab_color = new wxPanel(tabs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL);
    tabs->AddPage(tab_color, "Colors");
    tab_color->SetFont(font);
    create_color_tab(tab_color);



    wxGridBagSizer* main_sizer = new wxGridBagSizer(1,1);
    main_sizer->Add(tabs, wxGBPosition(1, 1), wxGBSpan(1, 3), wxEXPAND | wxTOP | wxLEFT | wxRIGHT);

    wxButton* bt_create_geometry = new wxButton(this, wxID_APPLY, _(L("Generate")));
    bt_create_geometry->Bind(wxEVT_BUTTON, &CreateMMUTiledCanvas::create_geometry, this);
    wxGetApp().UpdateDarkUI(bt_create_geometry);
    main_sizer->Add(bt_create_geometry, wxGBPosition(2, 1), wxGBSpan(1, 1), wxEXPAND | wxALIGN_LEFT);

    wxButton* bt_close = new wxButton(this, wxID_CLOSE, _(L("Close")));
    bt_close->Bind(wxEVT_BUTTON, &CreateMMUTiledCanvas::close_me, this);
    SetAffirmativeId(wxID_CLOSE);
    wxGetApp().UpdateDarkUI(bt_close);
    main_sizer->Add(bt_close, wxGBPosition(2, 3), wxGBSpan(1, 1), wxEXPAND | wxALIGN_RIGHT, 5);

    main_sizer->AddGrowableCol(2);
    main_sizer->AddGrowableRow(1);

    SetSizer(main_sizer);
    main_sizer->SetSizeHints(this);
    //wxSize dialog_size(800 * this->scale_factor(), 600 * this->scale_factor());
    wxDisplay display(wxDisplay::GetFromWindow(m_main_frame));
    wxRect screen = display.GetClientArea();
    //dialog_size.x = std::min(dialog_size.x, screen.width - 50);
    //dialog_size.y = std::min(dialog_size.y, screen.height - 50);
    if (screen.width > 1500 && screen.height > 1000)
        this->SetSize(wxSize(1200, 700));
    else if (screen.width > 2000 && screen.height > 1400)
        this->SetSize(wxSize(1600, 1000));
    else
        Fit();

    //set keyboard shortcut
    wxAcceleratorEntry entries[2];
    //entries[0].Set(wxACCEL_CTRL, (int) 'X', bt_create_geometry->GetId());
    //entries[2].Set(wxACCEL_SHIFT, (int) 'W', wxID_FILE1);
    //entries[0].Set(wxACCEL_CTRL, WXK_ESCAPE, wxID_CLOSE);
    //entries[1].Set(wxACCEL_NORMAL, WXK_F5, bt_create_geometry->GetId()); // wxID_FILE1);
    entries[0].Set(wxACCEL_CTRL, (int) 'G', bt_create_geometry->GetId());
    //entries[3].Set(wxACCEL_CTRL, (int) 'N', bt_new->GetId());
    //entries[4].Set(wxACCEL_CTRL | wxACCEL_SHIFT, (int) 'S', bt_save->GetId());
    //entries[5].Set(wxACCEL_CTRL, (int) 'S', bt_quick_save->GetId());
    entries[1].Set(wxACCEL_CTRL, WXK_F4, wxID_CLOSE);
    this->SetAcceleratorTable(wxAcceleratorTable(6, entries));


    this->CenterOnParent();
    //DoCentre(wxVERTICAL);
}


void CreateMMUTiledCanvas::create_main_tab(wxPanel* tab)
{
    wxGridBagSizer* main_sizer = new wxGridBagSizer(1, 1); //(int vgap, int hgap)

    wxBoxSizer* horiSizer = new wxBoxSizer(wxHORIZONTAL);
    wxButton* bt_open = new wxButton(tab, wxID_ANY, _L("Open") + dots);
    wxGetApp().UpdateDarkUI(bt_open);
    horiSizer->Add(bt_open, 0, wxALIGN_CENTER_VERTICAL);
    bt_open->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e) {
        if (!boost::filesystem::exists(m_filename_ctrl->GetValue().ToStdString())) {
            return;
        }
        //open default program
        wxFileType* ftype = wxTheMimeTypesManager->GetFileTypeFromExtension("png");
        wxFileType* ftypejpg = wxTheMimeTypesManager->GetFileTypeFromExtension("jpg");
        if (ftype) {
            boost::filesystem::path path(m_filename_ctrl->GetValue().ToStdString());
            path.make_preferred();
            try {
                wxString command = ftype->GetOpenCommand(path.string());
                wxString commandjpg;
                if (ftype) commandjpg = ftypejpg->GetOpenCommand(path.string());
                if (!command.empty()) {
                    wxExecute(command);
                    delete ftype;
                } else if (!commandjpg.empty()) {
                    wxExecute(commandjpg);
                    delete ftype;
                } else {
#ifdef _WIN32
                    command = "explorer \"" + path.string() + "\"";
                    std::system(command.data());
#elif __APPLE__
                    const char* argv[] = { "open", path.string().data(), nullptr };
                    ::wxExecute(const_cast<char**>(argv), wxEXEC_ASYNC, nullptr);
#else
                    const char* argv[] = { "xdg-open", path.string().data(), nullptr };

                    // Check if we're running in an AppImage container, if so, we need to remove AppImage's env vars,
                    // because they may mess up the environment expected by the file manager.
                    // Mostly this is about LD_LIBRARY_PATH, but we remove a few more too for good measure.
                    if (wxGetEnv("APPIMAGE", nullptr)) {
                        // We're running from AppImage
                        wxEnvVariableHashMap env_vars;
                        wxGetEnvMap(&env_vars);

                        env_vars.erase("APPIMAGE");
                        env_vars.erase("APPDIR");
                        env_vars.erase("LD_LIBRARY_PATH");
                        env_vars.erase("LD_PRELOAD");
                        env_vars.erase("UNION_PRELOAD");

                        wxExecuteEnv exec_env;
                        exec_env.env = std::move(env_vars);

                        wxString owd;
                        if (wxGetEnv("OWD", &owd)) {
                            // This is the original work directory from which the AppImage image was run,
                            // set it as CWD for the child process:
                            exec_env.cwd = std::move(owd);
                        }

                        ::wxExecute(const_cast<char**>(argv), wxEXEC_ASYNC, nullptr, &exec_env);
                    } else {
                        // Looks like we're NOT running from AppImage, we'll make no changes to the environment.
                        ::wxExecute(const_cast<char**>(argv), wxEXEC_ASYNC, nullptr, nullptr);
                    }
#endif
                }
            }
            catch (Exception) {}
        }
        }));
    m_filename_ctrl = new wxTextCtrl(tab, wxID_ANY, "");
    m_filename_ctrl->SetMinSize(wxSize(500, 0));
    horiSizer->Add(m_filename_ctrl, 0, wxEXPAND | wxALL);
    wxButton* bt_file = new wxButton(tab, wxID_ANY, _L("File") + dots);
    wxGetApp().UpdateDarkUI(bt_file);
    horiSizer->Add(bt_file, 0, wxALIGN_CENTER_VERTICAL);
    bt_file->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e) {
        wxFileDialog openFileDialog(this, _("Open png file"), "", "",
            "png files (*.png)|*.png", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
        if (openFileDialog.ShowModal() == wxID_CANCEL)
            return;
        m_config.set_key_value("offset", new ConfigOptionPoint(Vec2d(0, 0)));

        this->m_filename_ctrl->SetValue(openFileDialog.GetPath());
        this->get_canvas()->loadImage(openFileDialog.GetPath().ToStdString());
        this->get_canvas()->Refresh();
        }));
    wxButton* bt_rplace = new wxButton(tab, wxID_ANY, _L("r/place") + dots);
    wxGetApp().UpdateDarkUI(bt_rplace);
    horiSizer->Add(bt_rplace, 0, wxALIGN_CENTER_VERTICAL);
    bt_rplace->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e) {
        GetRPlaceDialog* dialog = new GetRPlaceDialog(this, wxID_ANY, _L("Choose your r/place moment"));
        int result = dialog->ShowModal();
        if (result == wxID_OK) {
            GetRPlaceDialog::last_timestamp = dialog->timestamp;
            boost::filesystem::path object_path(Slic3r::data_dir());
            object_path = object_path / "temp" / (std::to_string(dialog->timestamp) + ".png");
            if (!exists(object_path)) {
                get_file_from_web("https://rplace.space/combined/" + std::to_string(dialog->timestamp) + ".png", object_path);
            }

            this->m_filename_ctrl->SetValue(object_path.string());
            this->get_canvas()->loadImage(object_path.string());
            this->get_canvas()->Refresh();
        }
        }));

    //load default file
    {
        boost::filesystem::path object_path(Slic3r::data_dir());
        object_path = object_path / "temp" / "1649112424.png";
        if (!boost::filesystem::exists(object_path)) {
            if (!boost::filesystem::exists(boost::filesystem::path(Slic3r::data_dir()) / "temp"))
                boost::filesystem::create_directories(boost::filesystem::path(Slic3r::data_dir()) / "temp");
            get_file_from_web("https://rplace.space/combined/1649112424.png", object_path);
        }

        this->m_filename_ctrl->SetValue(object_path.string());
    }
    main_sizer->Add(horiSizer, wxGBPosition(1, 1), wxGBSpan(1, 2), wxEXPAND | wxALL, 2);


    group_size = std::make_shared<ConfigOptionsGroup>(tab, "Options", &m_config);
    group_size->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
        m_dirty = true;
        this->get_canvas()->Refresh();// paintNow();
        this->save_config();
    };
    group_size->title_width = 15;

    ConfigOptionDef def;
    Option option(def, "");
    Line line = { "", "" };

    //group_size->append_single_option_line(option);

    //line = { L("Size"), "" };
    group_size->append_single_option_line(group_size->get_option("size"));
    //line.append_option(Option(def, "size"));

    group_size->append_single_option_line(group_size->get_option("size_px"));
    //line.append_option(Option(def, "size_px"));

    //group_size->append_line(line);

    group_size->append_single_option_line(group_size->get_option("height"));

    group_size->append_single_option_line(group_size->get_option("offset"));

    line = { L("Gap"), "" };

    line.append_option(group_size->get_option("separation_xy"));

    line.append_option(group_size->get_option("separation_z"));

    group_size->append_line(line);

    group_size->append_single_option_line(group_size->get_option("bezel"));
    group_size->append_single_option_line(group_size->get_option("border"));
    

    //group_size->append_single_option_line(group_size->get_option("bump"));

    group_size->activate([]() {}, wxALIGN_RIGHT);
    group_size->reload_config();
    group_size->update_visibility(comSimple);
    main_sizer->Add(group_size->sizer, wxGBPosition(2, 2), wxGBSpan(1, 1), wxEXPAND | wxALL, 2);


    group_colors = std::make_shared<ConfigOptionsGroup>(tab, "Colors", &m_config);
    group_colors->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
        if ("extruders" == opt_key) {
            dynamic_cast<TabPrinter*>(this->m_gui_app->get_tab(Preset::TYPE_PRINTER))->extruders_count_changed(boost::any_cast<int>(value));
        }
        m_dirty = true;
        this->get_canvas()->Refresh();// paintNow();
        this->save_config();
    };
    group_colors->title_width = 15;

    group_colors->append_single_option_line(group_colors->get_option("spool_colors"));

    //line = { L("Separation"), "" };
    //line.append_option(group_colors->get_option("near_color"));
    //line.append_option(group_colors->get_option("color_comp"));
    //group_colors->append_line(line);
    group_colors->append_single_option_line(group_colors->get_option("near_color"));

    group_colors->append_single_option_line(group_colors->get_option("color_comp"));

    group_colors->append_single_option_line(group_colors->get_option("order_dark"));

    group_colors->append_single_option_line(group_colors->get_option("original"));

    group_colors->append_single_option_line(group_colors->get_option("extruders"));

    group_colors->append_single_option_line(group_colors->get_option("background_color"));

    //line = { "", "" };
    //line.full_width = 1;
    m_txt_extruder_count = new wxStaticText(tab, wxID_ANY, "test", wxDefaultPosition, wxDefaultSize);
    //line.widget = [this](wxWindow* parent) {
    //    auto sizer = new wxBoxSizer(wxHORIZONTAL);
    //    sizer->Add(nbExtruders, 1, wxEXPAND | wxALL, 0);
    //    return sizer;
    //};
    //group_colors->append_line(line);
    //FIXME: refresh from printer update;

    //group_colors->append_single_option_line(group_colors->get_option("near_color"));

    //#TODO
    //def.label = L("Colors");
    //def.type = coPoint;
    //def.tooltip = L("number of colors.");
    //def.set_default_value(new ConfigOptionPoint{ Vec2d{ 0,0 } });


    group_colors->activate([]() {}, wxALIGN_RIGHT);
    group_colors->reload_config();
    group_colors->update_visibility(comSimple);
    main_sizer->Add(group_colors->sizer, wxGBPosition(3, 2), wxGBSpan(1, 1), wxEXPAND | wxALL, 2);

    main_sizer->Add(m_txt_extruder_count, wxGBPosition(4, 2), wxGBSpan(1, 1), wxEXPAND | wxALL, 2);


    m_canvas = new BasicDrawPane(tab, &this->m_config);
    m_canvas->parent = this;
    this->get_canvas()->loadImage(m_filename_ctrl->GetValue().ToStdString());

    main_sizer->Add(m_canvas, wxGBPosition(2, 1), wxGBSpan(3, 1), wxEXPAND | wxALL, 2);
    main_sizer->AddGrowableCol(1);
    main_sizer->AddGrowableRow(4);

    tab->SetSizer(main_sizer);
}


class MywxColourPickerCtrl : public wxColourPickerCtrl {
public:
    static inline CreateMMUTiledCanvas* s_main_app = nullptr;

    MywxColourPickerCtrl(const std::string& col) : wxColourPickerCtrl(s_main_app->m_color_tab, wxID_ANY, wxColour(wxString(col))) { }
    static void save_all_colors() {
        std::vector<std::string> colors;
        for (ColorEntrySpool& ces : s_main_app->m_spools) colors.push_back(wxString::Format(wxT("#%02X%02X%02X"), ces.get_printed_color().Red(), ces.get_printed_color().Green(), ces.get_printed_color().Blue()).ToStdString());
        s_main_app->m_config.set_key_value("available_colors", new ConfigOptionStrings(colors));
        s_main_app->save_config();
    }

    static MywxColourPickerCtrl* add_color_bt(const std::string& color, wxSizer* sizer) {
        MywxColourPickerCtrl* clr_bt = new MywxColourPickerCtrl(color);
        s_main_app->m_spools.emplace_back(clr_bt);
        clr_bt->Bind(wxEVT_COLOURPICKER_CHANGED, ([](wxCommandEvent& e) {
            s_main_app->refresh_color_conversion(-1, false);
            MywxColourPickerCtrl::save_all_colors();
        }));
        clr_bt->GetPickerCtrl()->Bind(wxEVT_RIGHT_DOWN, ([clr_bt, sizer](wxMouseEvent& e) {
            //remove this color
            for (int i = 0; i < s_main_app->m_spools.size(); i++) {
                if (s_main_app->m_spools[i].widget == clr_bt && sizer->GetItem(i)->GetWindow() == clr_bt) {
                    s_main_app->m_spools.erase(s_main_app->m_spools.begin() + i);
                    s_main_app->refresh_color_conversion(i, false);
                    sizer->Detach(i);
                    break;
                }
            }
            //save alls
            MywxColourPickerCtrl::save_all_colors();
            clr_bt->Destroy();
            s_main_app->m_color_tab->GetSizer()->Layout();
            s_main_app->m_color_tab->Refresh();
        }));
        sizer->Add(clr_bt, wxSizerFlags().Left());
        if(s_main_app->m_color_tab->GetSizer())
            s_main_app->refresh_color_conversion(s_main_app->m_spools.size()-1, true);
        return clr_bt;
    }

};

class MywxOwnerDrawnComboBox : public wxOwnerDrawnComboBox, public CmbColorAssoc {
public:
    int idx = 0;
    CreateMMUTiledCanvas* m_main_app;
    wxBoxSizer* m_line;
    bool is_attached = false;

    bool is_auto() override {
        return GetSelection() == 0;
    }
    ColorEntry* get_print_color() override {
        if (is_auto()) {
            return nullptr;
        } else {
            int item = GetSelection();
            return &m_main_app->m_spools[item - 1];
        }
    }
    wxWindow* get_widget() {
        return this;
    }
    wxSizer* get_sizer() override {
        return m_line;
    }
    bool is_detached() override {
        return !is_attached;
    }

    void detach() override {
        m_main_app->all_lines_conversion->Detach(m_line);
        is_attached = false;
    }
    void attach() override {
        m_main_app->all_lines_conversion->Add(m_line, wxEXPAND | wxHORIZONTAL);
        is_attached = true;
    }

    void set_color_index(int new_idx) override {
        idx = new_idx;
    }

    MywxOwnerDrawnComboBox(CreateMMUTiledCanvas* main, wxBoxSizer* line, wxString label, int idx) : wxOwnerDrawnComboBox(main->m_color_tab, wxID_ANY, label), m_line(line), m_main_app(main), idx(idx){}

    void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const override {
        if (item == 0) {
            dc.SetBrush(*wxWHITE_BRUSH);
            dc.DrawRectangle(rect);
            dc.SetBrush(*wxBLACK_BRUSH);
            dc.DrawLabel(_L("Automatic"), rect, wxALIGN_CENTER_HORIZONTAL | wxALIGN_CENTER_VERTICAL);
        } else {
            if (item-1 < m_main_app->m_spools.size()) {
                dc.SetBrush(*wxTheBrushList->FindOrCreateBrush(m_main_app->m_spools[item-1].get_printed_color()));
                dc.DrawRectangle(rect);
            } else {
                dc.SetBrush(*wxBLACK_BRUSH);
                dc.DrawRectangle(rect);
            }
        }
    }
    wxCoord OnMeasureItem(size_t item) const override {
        return wxCoord(40);
    }
    wxCoord OnMeasureItemWidth(size_t item) const override {
        return wxCoord(120);
    }

    void refresh_auto_color() {
        if (is_auto()) {
            wxColour colour_real = m_main_app->m_used_colors[m_main_app->find_extruder(m_main_app->m_pixel_colors[idx].get_printed_color())]->get_printed_color();
            SetBackgroundColour(colour_real);
        } else {
            int item = GetSelection();
            wxColour colour_real = m_main_app->m_spools[item - 1].get_printed_color();
            SetBackgroundColour(colour_real);
        }
    }

};

int CreateMMUTiledCanvas::find_extruder(wxColour color) {
    int nb_extruders = dynamic_cast<TabPrinter*>(this->m_gui_app->get_tab(Preset::TYPE_PRINTER))->m_extruders_count;
    const int color_algo = m_config.option<ConfigOptionInt>("color_comp")->value;
    bool use_near_color = m_config.option<ConfigOptionBool>("near_color")->value;
    int idx_extruder = 0;
    for (int i = 0; i < m_used_colors.size() && i < nb_extruders; i++) {
        if (m_used_colors[i]->get_printed_color() == color) {
            idx_extruder = 1 + i;
            break;
        } else if (use_near_color && (idx_extruder <= 0 || (color_dist(color_algo, m_used_colors[i]->get_printed_color(), color) < color_dist(color_algo, m_used_colors[idx_extruder - 1]->get_printed_color(), color)))) {
            idx_extruder = 1 + i;
        }
    }
    return idx_extruder;
}

void CreateMMUTiledCanvas::recreate_color_conversion()
{
    auto create_line = [this](ColorEntry* col_entry, int index) {
        wxBoxSizer* line = new wxBoxSizer(wxHORIZONTAL);
        wxStaticText* col_start = new wxStaticText(m_color_tab, wxID_ANY, "");
        col_start->SetSize(80, 20);
        col_start->SetMinSize(wxSize(80, 20));
        col_start->SetBackgroundColour(col_entry->real_color);
        line->Add(col_start);
        //wxCheckBox* chk_auto = new wxCheckBox(tab, wxID_ANY, "Auto");
        //chk_auto->SetValue(true);
        //line->Add(chk_auto);
        line->Add(new wxStaticText(m_color_tab, wxID_ANY, _L("Choose specific spool color:")));
        
        MywxOwnerDrawnComboBox* clr_set = new MywxOwnerDrawnComboBox(this, line, _L("Automatic"), index);
        clr_set->Append(_L("Automatic"));
        for (int i = 0; i < this->m_spools.size(); i++) {
            clr_set->Append(std::to_string(i + 1));
        }
        clr_set->SetSelection(0);
        clr_set->Bind(wxEVT_COMBOBOX, [this, clr_set](wxCommandEvent&) {
            if (clr_set->is_auto()) {
                clr_set->SetBackgroundColour(*wxWHITE);
            } else {
                int id = clr_set->GetSelection();
                clr_set->SetBackgroundColour(this->m_spools[id - 1].get_printed_color());
            }
            clr_set->Refresh();
            });
        line->Add(clr_set);
        col_entry->widget_spool = clr_set;
    };

    std::vector<ColorEntry*> used;
    for (int idx = 0; idx < m_pixel_colors.size(); idx++) {
        ColorEntry& c = m_pixel_colors[idx];
        if (c.nb_pixels_real > 0) {
            used.push_back(&c);
            if (!c.widget_spool) {
                create_line(&c, idx);
            }
        }
        // detach all
        if(c.widget_spool && !c.widget_spool->is_detached()){
            c.widget_spool->detach();
        }
    }
    
    // order
    std::sort(used.begin(), used.end(), [](ColorEntry* e1, ColorEntry* e2) { return e1->nb_pixels_real > e2->nb_pixels_real; });

    // attach/create
    for (ColorEntry* c : used) {
        c->widget_spool->attach();
    }

}

//refresh color from comboboxes & destroyed links
void CreateMMUTiledCanvas::refresh_color_conversion(int del_idx, bool is_add_not_del) {
    for (int i = 0; i < m_pixel_colors.size(); i++) {
        ColorEntry& c = m_pixel_colors[i];
        if (c.widget_spool && !c.widget_spool->is_detached()) {
            MywxOwnerDrawnComboBox* clr_set = (MywxOwnerDrawnComboBox*)c.widget_spool->get_widget();
            clr_set->m_line->GetChildren().front()->GetWindow()->SetBackgroundColour(c.real_color);
            if (del_idx < 0) {
                //just refresh
                if (clr_set->is_auto()) {
                    clr_set->SetBackgroundColour(*wxWHITE);
                } else {
                    int id = clr_set->GetSelection();
                    clr_set->SetBackgroundColour(this->m_spools[id - 1].get_printed_color());
                }
                clr_set->Refresh();
            } else if(!is_add_not_del){
                if (!clr_set->is_auto()) {
                    int id = clr_set->GetSelection();
                    if (id - 1 == del_idx) {
                        clr_set->Select(0);
                    } else if (id - 1 > del_idx) {
                        clr_set->Select(id - 1);
                    }
                }
            } else if (is_add_not_del) {
                clr_set->Append(std::to_string(this->m_spools.size()));
            }
        }
    }
    if (m_color_tab->GetSizer()) {
        m_color_tab->GetSizer()->Layout();
        m_color_tab->Refresh();
    }
}

void CreateMMUTiledCanvas::create_color_tab(wxPanel* tab)
{
    m_color_tab = tab;
    MywxColourPickerCtrl::s_main_app = this;

    wxGridBagSizer* color_sizer = new wxGridBagSizer(1, 1); //(int vgap, int hgap)

    wxWrapSizer* color_row_sizer = new wxWrapSizer(wxHORIZONTAL);
    wxBoxSizer* first_line = new wxBoxSizer(wxHORIZONTAL);
    wxButton* bt_new_color = new wxButton(tab, wxID_ANY, _L("Add one") + dots);
    wxGetApp().UpdateDarkUI(bt_new_color);
    bt_new_color->Bind(wxEVT_BUTTON, ([this, color_row_sizer](wxCommandEvent& e) {
        MywxColourPickerCtrl::add_color_bt("#000000", color_row_sizer);
        m_color_tab->GetSizer()->Layout();
        m_color_tab->Refresh();
        MywxColourPickerCtrl::save_all_colors();

    }));
    first_line->Add(new wxStaticText(tab, wxID_ANY, _L("Available filament colors in your spools (right clic to delete)")), wxSizerFlags().Left());
    first_line->Add(bt_new_color, wxSizerFlags().Left());
    color_sizer->Add(first_line, wxGBPosition(1, 1), wxGBSpan(1, 2), wxEXPAND | wxALL, 2);

    //row of available colors
    //group_colors->append_single_option_line(group_colors->get_option("available_colors"));
    ConfigOptionStrings* available_colors = m_config.option<ConfigOptionStrings>("available_colors");
    for (int i = 0; i < available_colors->values.size(); i++) {
        MywxColourPickerCtrl::add_color_bt(available_colors->values[i], color_row_sizer);
    }
    tab->Refresh();
    color_sizer->Add(color_row_sizer, wxGBPosition(2, 1), wxGBSpan(1, 2), wxEXPAND | wxALL, 2);


    color_sizer->Add(new wxStaticText(tab, wxID_ANY, _L("For each needed color, chose the spool color (or let the algorithm choose)")), wxGBPosition(3, 1), wxGBSpan(1, 2), wxEXPAND | wxALL, 2);

    //color convertion
    all_lines_conversion = new wxBoxSizer(wxVERTICAL);
    color_sizer->Add(all_lines_conversion, wxGBPosition(4, 1), wxGBSpan(1, 2), wxEXPAND | wxHORIZONTAL | wxALIGN_TOP | wxALIGN_LEFT, 2);


    color_sizer->AddGrowableCol(2);
    color_sizer->AddGrowableRow(3);

    tab->SetSizer(color_sizer);

}

void CreateMMUTiledCanvas::refresh_description() {
    std::string descrp = "To print all colors, you need " + std::to_string(m_used_colors.size()) + " extruders";
    m_txt_extruder_count->SetLabelText(descrp);
}

void CreateMMUTiledCanvas::on_dpi_changed(const wxRect& suggested_rect)
{
    msw_buttons_rescale(this, em_unit(), { wxID_APPLY, wxID_CLOSE });

    wxSize oldSize = this->GetSize();
    Layout();
    this->SetSize(oldSize.x * this->scale_factor() / this->prev_scale_factor(), oldSize.y * this->scale_factor() / this->prev_scale_factor());
    Refresh();
}

void CreateMMUTiledCanvas::close_me(wxCommandEvent& event_args) {
    //save conf

    this->m_gui_app->change_calibration_dialog(this, nullptr);
    this->Destroy();
}


// Generate the vertex list for a cube solid of arbitrary size in X/Y/Z.
indexed_triangle_set its_make_pyramid_inverted(double xd, double yd, double zd, double bezel)
{
    if (bezel == 0) return its_make_cube(xd, yd, zd);

    auto x = float(xd), y = float(yd), z = float(zd), b = float(bezel);

    float x2 = x - b;
    float y2 = y - b;
    if (x2 > b && y2 > b) {
        return {
            { {0, 1, 2}, {0, 2, 3}, {4, 5, 6}, {4, 6, 7},
              {0, 4, 7}, {0, 7, 1}, {1, 7, 6}, {1, 6, 2},
              {2, 6, 5}, {2, 5, 3}, {4, 0, 3}, {4, 3, 5} },
            { {x2,y2,0}, {x2,b, 0}, {b, b, 0}, {b,y2, 0},
              {x, y, z}, {0, y, z}, {0, 0, z}, {x, 0, z} }
        };
    } else if (x2 <= b && y2 <= b) {
        return {
            { {0, 3, 2}, {0, 2, 1}, {0, 1, 4}, {0, 4, 3}, //4 faces
            {1, 2, 3}, {1, 3, 4} }, //top
            { {x / 2,y / 2,0},
              {x, y, z}, {0, y, z}, {0, 0, z}, {x, 0, z} }
        };
    } else if (x2 <= b && y2 > b) {
        return {
            { {0, 3, 2}, {1, 5, 4}, //2 simple faces
             {0, 2, 5}, {0, 5, 1}, {1, 4, 3}, {1, 3, 0}, //2 double faces
            {2, 3, 4}, {2, 4, 5} }, //top
            { {x/2,b,0}, {x/2,y2,0},
              {0, 0, z},  {x, 0, z}, {x, y, z}, {0, y, z} }
        };
    } else /*if (x2 > b && y2 <= b)*/ {
        return {
            { {0, 2, 5}, {1, 4, 3}, //2 simple faces
             {0, 5, 4}, {0, 4, 1}, {1, 3, 2}, {1, 2, 0}, //2 double faces
            {2, 3, 4}, {2, 4, 5} }, //top
            { {b,y/2,0}, {x2,y/2,0},
              {0, 0, z}, {x, 0, z}, {x, y, z}, {0, y, z} }
        };
    }
}

void CreateMMUTiledCanvas::create_geometry(wxCommandEvent& event_args) {


    //create the base
    Plater* plat = this->m_main_frame->plater();
    plat->take_snapshot(_L("Create Tile"));
    Model& model = plat->model();
    //if (!plat->new_project(L("Tile")))
    //    return;
    model.clear_objects();
    plat->set_project_filename(L("Mosaic"));

    const DynamicPrintConfig* print_config = this->m_gui_app->get_tab(Preset::TYPE_FFF_PRINT)->get_config();
    const DynamicPrintConfig* filament_config = this->m_gui_app->get_tab(Preset::TYPE_FFF_FILAMENT)->get_config();
    const DynamicPrintConfig* printer_config = this->m_gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();

    Vec2d offset_dbl = m_config.option<ConfigOptionPoint>("offset")->value;
    wxSize offset(std::min(int(offset_dbl.x()), std::max(0, m_canvas->bmp.GetSize().x - 1)), std::min(int(offset_dbl.y()), std::max(0, m_canvas->bmp.GetSize().y - 1)));
    Vec2d size_dbl = m_config.option<ConfigOptionPoint>("size")->value;
    wxSize size(std::min(int(size_dbl.x()), m_canvas->bmp.GetSize().x - offset.x), std::min(int(size_dbl.y()), m_canvas->bmp.GetSize().y - offset.y));
    Vec2d pixel_size = m_config.option<ConfigOptionPoint>("size_px")->value;
    double separation = m_config.opt_float("separation_xy");
    double height = m_config.opt_float("height");
    double separation_z = m_config.opt_float("separation_z");
    double bezel = m_config.opt_float("bezel");
    double border = m_config.opt_float("border");
    //double first_layer_height = print_config->get_computed_value("first_layer_height");
    double layer_height = print_config->get_computed_value("layer_height");
    if (separation_z > height)
        height = separation_z;

    Vec2d total_size{ size.x * (pixel_size.x() + separation) - separation, size.y * (pixel_size.y() + separation) - separation };

    int nb_extruders = dynamic_cast<TabPrinter*>(this->m_gui_app->get_tab(Preset::TYPE_PRINTER))->m_extruders_count;
    bool use_near_color = m_config.option<ConfigOptionBool>("near_color")->value;
    const int color_algo = m_config.option<ConfigOptionInt>("color_comp")->value;
    const std::string background_color = m_config.option<ConfigOptionString>("background_color")->value;
    const bool order_dark = m_config.option<ConfigOptionBool>("order_dark")->value;
    const bool use_spool_colors = m_config.option<ConfigOptionBool>("spool_colors")->value;

    //sort used color by brightness, to begin dark and lighter and lighter.
    std::sort(m_used_colors.begin(), m_used_colors.end(), [order_dark, use_spool_colors](ColorEntry* ce1, ColorEntry* ce2) {
        wxColour col1 = ce1->get_printed_color(use_spool_colors);
        wxColour col2 = ce2->get_printed_color(use_spool_colors);
        if(order_dark)
            return col1.Red() + col1.Green() + col1.Blue() < col2.Red() + col2.Green() + col2.Blue();
        else
            return col1.Red() + col1.Green() + col1.Blue() > col2.Red() + col2.Green() + col2.Blue();
        });

    std::vector<size_t> objs_idx;
    int idx_extruder_base = 0;
    if (use_near_color) {
        //find extruder
        wxColor color (background_color);
        for (int i = 0; i < m_used_colors.size() && i < nb_extruders; i++) {
            if (idx_extruder_base <= 0 || (color_dist(color_algo, m_used_colors[i]->get_printed_color(use_spool_colors), color) < color_dist(color_algo, m_used_colors[idx_extruder_base - 1]->get_printed_color(use_spool_colors), color))) {
                idx_extruder_base = 1 + i;
            }
        }
    }
    TriangleMesh mesh(its_make_cube(total_size.x() + (border > 0 ? 2 * separation : 0), total_size.y() + (border > 0 ? 2 * separation : 0), height - separation_z));
    if (separation_z >= height) {
        //phony volume
        mesh = TriangleMesh(its_make_cube(0.01, 0.01, 0.01));
    }
    { //this->m_gui_app->obj_list()->load_mesh_object(mesh, _L("Base Tile"), false);
#ifdef _DEBUG
        check_model_ids_validity(model);
#endif /* _DEBUG */
        auto bb = mesh.bounding_box();
        ModelObject* new_object = model.add_object();
        new_object->name = into_u8(_L("Base Tile"));
        new_object->add_instance(); // each object should have at list one instance

        ModelVolume* new_volume = new_object->add_volume(mesh);
        if (border > 0) {
            new_volume->set_offset(Vec3d{ new_volume->get_offset().x() -separation, new_volume->get_offset().y() -separation, new_volume->get_offset().z() });
        }
        new_object->sort_volumes(wxGetApp().app_config->get("order_volumes") == "1");
        new_volume->name = new_object->name;
        // set a default extruder value
        new_volume->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder_base));
        new_object->invalidate_bounding_box();
        //new_object->translate(-bb.center());

        //new_object->instances[0]->set_offset(false ?
        //    to_3d(wxGetApp().plater()->build_volume().bounding_volume2d().center(), -new_object->origin_translation.z()) :
        //    bb.center());

        new_object->ensure_on_bed();

        objs_idx.push_back(model.objects.size() - 1);
    }
    objs_idx.push_back(0);

    if (border > 0) {
        TriangleMesh mesh_N(its_make_cube(total_size.x() + border + 2 * separation, border, height));
        ModelVolume* vol_N = model.objects[0]->add_volume(std::move(mesh_N), ModelVolumeType::MODEL_PART, false);
        vol_N->name = "border_N";
        vol_N->set_offset(Vec3d{ -(border + separation) , -(border + separation) , 0 });
        vol_N->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder_base));

        TriangleMesh mesh_E(its_make_cube(border, total_size.x() + border + 2 * separation, height));
        ModelVolume* vol_E = model.objects[0]->add_volume(std::move(mesh_E), ModelVolumeType::MODEL_PART, false);
        vol_E->name = "border_E";
        vol_E->set_offset(Vec3d{ total_size.x() + (separation) , -(border + separation) , 0 });
        vol_E->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder_base));

        TriangleMesh mesh_S(its_make_cube(total_size.x() + border + 2*separation, border, height));
        ModelVolume* vol_S = model.objects[0]->add_volume(std::move(mesh_S), ModelVolumeType::MODEL_PART, false);
        vol_S->name = "border_S";
        vol_S->set_offset(Vec3d{ -(separation) , total_size.y() + (separation) , 0});
        vol_S->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder_base));

        TriangleMesh mesh_W(its_make_cube(border, total_size.x() + border + 2 * separation, height));
        ModelVolume* vol_W = model.objects[0]->add_volume(std::move(mesh_W), ModelVolumeType::MODEL_PART, false);
        vol_W->name = "border_W";
        vol_W->set_offset(Vec3d{ -(border + separation) , -(separation) , 0 });
        vol_W->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder_base));
    }

    wxNativePixelData data(m_canvas->bmp);
    wxNativePixelData::Iterator p(m_canvas->bmp, data);
    if (offset.y > 0)
        p.OffsetY(data, offset.y);
    for (int y = 0; y < size.y; ++y) {
        wxNativePixelData::Iterator rowStart = p;
        if (offset.x > 0)
            p.OffsetX(data, offset.x);
        for (int x = 0; x < size.x; x++, ++p) {
            wxColour color(p.Red(), p.Green(), p.Blue());
            //first check if there is an overide
            for (ColorEntry& c : m_pixel_colors) {
                if (c.real_color == color) {
                    if (use_spool_colors && c.widget_spool && !c.widget_spool->is_auto()) {
                        color = c.widget_spool->get_print_color()->get_printed_color(use_spool_colors);
                    }
                }
            }
            //find extruder
            int idx_extruder = find_extruder(color);
            //for (int i = 0; i < m_canvas->colours.size() && i < nb_extruders; i++) {
            //    if (m_canvas->colours[i].first == color) {
            //        idx_extruder = 1 + i;
            //        break;
            //    } else if (use_near_color && (idx_extruder <= 0 || (color_dist(color_algo, m_canvas->colours[i].first, color) < color_dist(color_algo, m_canvas->colours[idx_extruder - 1].first, color)))) {
            //        idx_extruder = 1 + i;
            //    }
            //}
            //uncolored
            if (separation_z > 0) {
                TriangleMesh mesh(its_make_pyramid_inverted(pixel_size.x(), pixel_size.y(), separation_z - layer_height, bezel));
                ModelVolume* vol = model.objects[0]->add_volume(std::move(mesh), ModelVolumeType::MODEL_PART, false);
                vol->name = "base_" + std::to_string(offset.x + x) + "_" + std::to_string(offset.y + y);
                vol->set_offset(Vec3d{ x * (pixel_size.x() + separation), total_size.y() - y * (pixel_size.y() + separation) - pixel_size.y(), height - separation_z });
                vol->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder_base));
            }
            //colored
            {
                TriangleMesh mesh(its_make_cube(pixel_size.x(), pixel_size.y(), layer_height));
                ModelVolume* vol = model.objects[0]->add_volume(std::move(mesh), ModelVolumeType::MODEL_PART, false);
                vol->name = "tile_" + std::to_string(offset.x + x) + "_" + std::to_string(offset.y + y);
                vol->set_offset(Vec3d{ x * (pixel_size.x() + separation), total_size.y() - y * (pixel_size.y() + separation) - pixel_size.y(), height - layer_height });
                vol->config.set_key_value("extruder", new ConfigOptionInt(idx_extruder));
            }
        }
        p = rowStart;
        p.OffsetY(data, 1);
    }

    //for (ModelObject* mo : model.objects) {
    //    objs_idx.push_back(i++);
    //}



    ////open file
    //Plater* plat = this->m_main_frame->plater();
    //Model& model = plat->model();
    //if(cmb_add_replace->GetSelection() == 0)
    //    plat->new_project();
    //std::vector<size_t> objs_idx = plat->load_files(std::vector<std::string>{ object_path.generic_string() }, true, false, false, false);
    //if (objs_idx.empty()) return;
    ////don't save in the temp directory: erase the link to it
    //for (int idx : objs_idx)
    //    model.objects[idx]->input_file = "";
    ///// --- translate ---
    //const DynamicPrintConfig* printerConfig = this->m_gui_app->get_tab(Preset::TYPE_PRINTER)->get_config();
    //const ConfigOptionPoints* bed_shape = printerConfig->option<ConfigOptionPoints>("bed_shape");
    //Vec2d bed_size = BoundingBoxf(bed_shape->values).size();
    //Vec2d bed_min = BoundingBoxf(bed_shape->values).min;
    //model.objects[objs_idx[0]]->translate({ bed_min.x() + bed_size.x() / 2, bed_min.y() + bed_size.y() / 2, 0 });

    //update colors
    {
        DynamicPrintConfig new_Printer_config = *printer_config; //make a copy
        //{m_impl=L"#800040" m_convertedToChar={m_str=0x0000000000000000 <NULL> m_len=0 } }
        const ConfigOptionStrings* color_conf = printer_config->option<ConfigOptionStrings>("extruder_colour");
        ConfigOptionStrings* new_color_conf = static_cast<ConfigOptionStrings*>(color_conf->clone());
        for(int idx_col = 0; idx_col < this->m_used_colors.size() && idx_col < new_color_conf->values.size(); idx_col++){
            wxColour col = this->m_used_colors[idx_col]->get_printed_color(use_spool_colors);
            new_color_conf->values[idx_col] = "#" + AppConfig::int2hex(col.GetRGB());
        }
        new_Printer_config.set_key_value("extruder_colour", new_color_conf);

        this->m_gui_app->get_tab(Preset::TYPE_PRINTER)->load_config(new_Printer_config);
        this->m_main_frame->plater()->on_config_change(new_Printer_config);
        this->m_gui_app->get_tab(Preset::TYPE_PRINTER)->update_dirty();
    }

    //update plater
    plat->changed_objects(objs_idx);
    //update everything, easier to code.
    ObjectList* obj = this->m_gui_app->obj_list();
    obj->update_after_undo_redo();

    if (objs_idx.size() > 1)
        plat->arrange();

    //plat->reslice();
    plat->select_view_3D("3D");

}

} // namespace GUI
} // namespace Slic3r
